summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorliuxueli <[email protected]>2022-12-08 18:01:52 +0800
committerliuxueli <[email protected]>2022-12-08 18:01:52 +0800
commita5c73fc33664eb542b14fc2dff58b8b067d2ca96 (patch)
tree33b12dad53051665a967f9922fa9ad0fbb92361a
parent8c77537c819ac4d99fbe92d546047251cc891b7e (diff)
TSG-12533: 处理SmartOffload上报统计会话信息计数feature-TSG-12533-deal-offload-report
-rw-r--r--include/private/sapp_pkt_stat.h3
-rw-r--r--include/private/stream_internal.h25
-rw-r--r--include/public/stream_inc/stream_control.h5
-rw-r--r--module_test/include/fake_marsio.h12
-rw-r--r--module_test/src/gtest_fake_marsio_env.cpp213
-rw-r--r--module_test/src/gtest_fake_marsio_plug.cpp145
-rw-r--r--module_test/src/gtest_fake_marsio_run.cpp57
-rw-r--r--module_test/src/gtest_main.cpp15
-rw-r--r--module_test/src/gtest_sapp_fun.h4
-rw-r--r--module_test/src/gtest_sapp_tcp_plug.cpp2
-rw-r--r--src/dealpkt/deal_tcp.c305
-rw-r--r--src/dealpkt/deal_udp.c335
-rw-r--r--src/inner_plug/sapp_assistant.cpp60
-rw-r--r--src/packet_io/packet_io_marsio.c10
-rw-r--r--src/packet_io/sendpacket.c18
15 files changed, 1030 insertions, 179 deletions
diff --git a/include/private/sapp_pkt_stat.h b/include/private/sapp_pkt_stat.h
index bc6e137..a1b6087 100644
--- a/include/private/sapp_pkt_stat.h
+++ b/include/private/sapp_pkt_stat.h
@@ -189,6 +189,9 @@ typedef enum __sapp_sys_stat_type{
SAPP_STAT_UDP_OFFLOAD_PKTS,
SAPP_STAT_UDP_OFFLOAD_BYTES,
+ SAPP_STAT_OFFLOAD_STREAM, /* total offload stream, opt_val type must be unsigned long long */
+ SAPP_STAT_OFFLOAD_INBOUND, /* total offload inbound packet number, opt_val type must be unsigned long long */
+ SAPP_STAT_OFFLOAD_OUTBOUND, /* total offload outbound packet number, opt_val type must be unsigned long long */
/************* memory stat *******************/
diff --git a/include/private/stream_internal.h b/include/private/stream_internal.h
index cc9f1cd..d9003e1 100644
--- a/include/private/stream_internal.h
+++ b/include/private/stream_internal.h
@@ -76,9 +76,11 @@ typedef struct {
const void *raw_pkt_data; /* ���ϲ�Ӧ�ÿ���ԭʼ��ͷָ��, �п���������Ethernet��, ����low_layer_type�ж�Э������ */
struct timeval raw_pkt_ts; /* ԭʼ������ʱ���, ���ȫΪ0��֧�ִ˹���(��pagģʽ) */
const void *io_lib_pkt_reference; /* ���õײ�I/O���ԭʼ�������ṹ, ����:����marsio��˵, ���ײ��mbuf�ṹ */
- int route_dir;
int device_index;/* �ж������ʱ, Ҫ��֤���ĸ������ʹ��ĸ����� */
- int is_overlay_pkt; /* ��ʾ����ʵ��·�е����ݰ�, Ҫ��������ע, ��������������һ������; ����Ҫ���� */
+ char route_dir;
+ char is_overlay_pkt; /* ��ʾ����ʵ��·�е����ݰ�, Ҫ��������ע, ��������������һ������; ����Ҫ���� */
+ char padding[2];
+ int is_offload_report;
unsigned short vlan_flipping_couple[2]; /*2020-09-28 lijia add, in host order, vlan flipping for adev, index0��ʾ�յ���ǰ����vlan_id, index1��ʾԭ��ת����vlan_id */
unsigned char mac_flipping_enable;
char diagnose_error_to_dump; /* ��ij�ִ������ݰ�, ����pkt_dump�洢��udp socket���͸�tcpdump_mesa */
@@ -221,9 +223,14 @@ struct tcpdetail_private
UCHAR creat_mod;
UINT16 tcpoverlen; // modify by lqy 20150225, ��¼��ǰ������һ�������ص�tcp���ȣ�
UCHAR offload_stream_flag; //2022-04-13 liuxueli add, ������������stream
- UCHAR pad;
+ UCHAR c2s_smartoffload:1;
+ UCHAR s2c_smartoffload:1;
+ UCHAR c2s_smartoffload_report:1;
+ UCHAR s2c_smartoffload_report:1;
+ UCHAR pad:4;
/* ===8 bytes=== */
- time_t offload_stream_timestamp_s;
+ time_t offload_c2s_timestamp_s;
+ time_t offload_s2c_timestamp_s;
struct half_tcpstream *pclient; //��client��TCP������Ϣ
struct half_tcpstream *pserver; //�� server��TCP������Ϣ
@@ -253,8 +260,14 @@ struct udpdetail_private
struct udp_flow_stat *flow_stat; /* 2015-12-28 lijia add, udpdetail�е���ϸ����(64bit), ʵ���ڴ������ͷ���projectģ�����, ����ΪNULL */
UCHAR drop_stream_flag; //2020-06-02 lijia add, ����ͬDROPPKT, ֻ����������������stream
UCHAR offload_stream_flag; //2022-04-13 liuxueli add, ������������stream
- UCHAR pad[6];
- time_t offload_stream_timestamp_s;
+ UCHAR c2s_smartoffload:1;
+ UCHAR s2c_smartoffload:1;
+ UCHAR c2s_smartoffload_report:1;
+ UCHAR s2c_smartoffload_report:1;
+ UCHAR padding:4;
+ UCHAR pad[5];
+ time_t offload_c2s_timestamp_s;
+ time_t offload_s2c_timestamp_s;
};
/* 2015-02-26 lijia add, for stream-addr-list ntop, pton */
diff --git a/include/public/stream_inc/stream_control.h b/include/public/stream_inc/stream_control.h
index c601e7a..ef8c2a2 100644
--- a/include/public/stream_inc/stream_control.h
+++ b/include/public/stream_inc/stream_control.h
@@ -108,6 +108,11 @@ enum sapp_platform_opt{
SPO_CONFIG_ROOT_DIR, /* config file root directory, opt_val type must be char[], opt_val_len is value-result argument */
SPO_DATA_ROOT_DIR, /* data or state file root directory, opt_val type must be char[], opt_val_len is value-result argument */
SPO_DEPLOYMENT_MODE, /* Similar to SPO_DEPLOYMENT_MODE_STR, opt_val type is sapp_deploment_mode_t */
+ SPO_TOTAL_OFFLOAD_STREAM, /* total offload stream, opt_val type must be unsigned long long */
+ SPO_TOTAL_OFFLOAD_INBOUND_PKT, /* total offload inbound packet number, opt_val type must be unsigned long long */
+ SPO_TOTAL_OFFLOAD_INBOUND_BYTE, /* total offload inbound packet bytes, opt_val type must be unsigned long long */
+ SPO_TOTAL_OFFLOAD_OUTBOUND_PKT, /* total offload outbound packet number, opt_val type must be unsigned long long */
+ SPO_TOTAL_OFFLOAD_OUTBOUND_BYTE, /* total offload outbound packet bytes, opt_val type must be unsigned long long */
};
diff --git a/module_test/include/fake_marsio.h b/module_test/include/fake_marsio.h
index 041bb0f..389a03e 100644
--- a/module_test/include/fake_marsio.h
+++ b/module_test/include/fake_marsio.h
@@ -155,6 +155,7 @@ typedef struct{
unsigned char raw_pkt_data[FAKE_MARSIO_MTU]; /* 原始包 */
int raw_pkt_len;
+ int is_ctrlbuf;
struct mr_tunnat_ctrlzone ctrlzone;
}marsio_buff_t;
@@ -164,11 +165,22 @@ typedef struct{
int pkt_num; /* pcap包里的数据包个数 */
}pcap_queue_t;
+struct smartoffload_report
+{
+ uint16_t magic;
+ uint16_t dir;
+ uint64_t hit_cnts;
+ uint64_t hit_bytes;
+};
+
struct mr_instance{
void *log_handle;
pcap_queue_t pkt_queue;
int pcap_queue_index; /* 当前处理到第几个包 */
+ int is_offload;
+ marsio_buff_t offload_pkt;
+ marsio_buff_t offload_report_pkt[2];
marsio_buff_t inject_pkt_buf; /* 用于给sapp调用 marsio_buff_malloc_global() 的返回值, 可以保存插件注入的数据包, 用来比较 */
};
diff --git a/module_test/src/gtest_fake_marsio_env.cpp b/module_test/src/gtest_fake_marsio_env.cpp
index f59b2e7..fd822a4 100644
--- a/module_test/src/gtest_fake_marsio_env.cpp
+++ b/module_test/src/gtest_fake_marsio_env.cpp
@@ -9,6 +9,7 @@
#include <arpa/inet.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
+#include <netinet/ip6.h>
#include <sys/un.h>
#include <errno.h>
#include <linux/if_tun.h>
@@ -22,6 +23,7 @@
#include <pthread.h>
#include "fake_marsio.h"
#include "fake_mrtunnat.h"
+#include "FakeInterface.h"
#include <pcap/pcap.h>
#include "gtest_sapp_fun.h"
@@ -255,6 +257,18 @@ static void __fake_marsio_vlan_mac_flip_inject_cb(u_char *user, const struct pca
}
+static void __fake_marsio_offload_copy_packet_cb(u_char *user, const struct pcap_pkthdr *hdr, const u_char *data)
+{
+ const struct pkt_check_args_t *check_args = (struct pkt_check_args_t *)user;
+
+ if(marsio_buff_is_ctrlbuf(check_args->mbuff))
+ {
+ sendto_test_result(GTEST_FAKE_MARSIO_SUCC);
+ fprintf(stderr, "\033[32mmarsio_offload_copy_packet_cb() test success!\033[0m\n");
+ exit(0);
+ }
+}
+
/*
TODO:
这些函数大同小异, 都是检查某个数据包某个字段是否存在、是什么值、是不是反向,
@@ -268,6 +282,7 @@ static pcap_md5_tuple_t fake_marsio_md5_tuple[] =
{"50ef8a3004c9460482d8628c8187f533", GTEST_RESULT_NONE, __fake_marsio_vlan_flip_symmetric_mpls_cb, "测试开启vlan flipping + symmetric_mpls 0vs1 的回流回注功能"},
{"04d5ffa60b959efe7a87ea31fd5fecd9", GTEST_RESULT_NONE, __fake_marsio_vlan_flip_symmetric_mpls_cb, "测试开启vlan flipping + symmetric_mpls 1vs2 的回流回注功能"},
{"777460d92d1b4e98ee22cd14139fa772", GTEST_RESULT_NONE, __fake_marsio_vlan_mac_flip_inject_cb, "测试开启vlan和mac flipping, 插件主动注入数据包的测试"},
+ {"d333d356e1a8146adb390ed66462a0ed", GTEST_RESULT_NONE, __fake_marsio_offload_copy_packet_cb, "测试开启offload report测试"},
{NULL, GTEST_SAPP_ERR, NULL, NULL}, /* EOF */
};
@@ -280,7 +295,9 @@ static void __pcap_pkt_handle(u_char *user, const struct pcap_pkthdr *hdr, const
int route_dir;
pcap_pkt_queue->pkt_array = (marsio_buff_t *)realloc(pcap_pkt_queue->pkt_array, sizeof(marsio_buff_t) * (pcap_pkt_queue->pkt_num + 1));
-
+
+ memset(&pcap_pkt_queue->pkt_array[pcap_pkt_queue->pkt_num], 0, sizeof(marsio_buff_t));
+
memcpy(pcap_pkt_queue->pkt_array[pcap_pkt_queue->pkt_num].raw_pkt_data, data, hdr->caplen);
pcap_pkt_queue->pkt_array[pcap_pkt_queue->pkt_num].raw_pkt_len = hdr->caplen;
pcap_pkt_queue->pkt_array[pcap_pkt_queue->pkt_num].by_malloc_need_free = 0;
@@ -304,6 +321,155 @@ static void __pcap_pkt_handle(u_char *user, const struct pcap_pkthdr *hdr, const
pcap_pkt_queue->pkt_num++;
}
+static int get_offload_report_dir(marsio_buff_t *real_pkt, marsio_buff_t *offload_pkt)
+{
+ struct ethhdr *offload_pkt_eth=(struct ethhdr *)offload_pkt->raw_pkt_data;
+ if(ntohs(offload_pkt_eth->h_proto)==ETH_P_IP)
+ {
+ struct iphdr *o_ipv4 =(struct iphdr *)MESA_jump_layer((struct ethhdr *)offload_pkt->raw_pkt_data, ADDR_TYPE_MAC, ADDR_TYPE_IPV4);
+ struct iphdr *r_ipv4 =(struct iphdr *)MESA_jump_layer((struct ethhdr *)real_pkt->raw_pkt_data, ADDR_TYPE_MAC, ADDR_TYPE_IPV4);
+ if(o_ipv4->saddr!=r_ipv4->saddr)
+ {
+ return 0;
+ }
+ }
+ else
+ {
+ struct ip6_hdr *o_ipv6 =(struct ip6_hdr *)MESA_jump_layer((struct ethhdr *)offload_pkt->raw_pkt_data, ADDR_TYPE_MAC, ADDR_TYPE_IPV6);
+ struct ip6_hdr *r_ipv6 =(struct ip6_hdr *)MESA_jump_layer((struct ethhdr *)real_pkt->raw_pkt_data, ADDR_TYPE_MAC, ADDR_TYPE_IPV6);
+ if(strncmp((const char *)&(o_ipv6->ip6_src), (const char *)&(r_ipv6->ip6_src), sizeof(struct in6_addr))!=0)
+ {
+ return 0;
+ }
+ }
+
+
+ return 1;
+}
+
+static int build_simulated_packet(marsio_buff_t *mbufs, marsio_buff_t *offload_simulated_pkt, struct smartoffload_report *report)
+{
+ if(offload_simulated_pkt==NULL)
+ {
+ return 0;
+ }
+
+ int offset=0;
+ char protocol=0;
+ unsigned char *buff=mbufs->raw_pkt_data;
+ unsigned char *sample_pkt=offload_simulated_pkt->raw_pkt_data;
+ struct ethhdr *s_pkt_th=(struct ethhdr *)sample_pkt;
+
+ memcpy(buff+offset, sample_pkt, sizeof(struct ethhdr));
+ offset+=sizeof(struct ethhdr);
+ if(ntohs(s_pkt_th->h_proto)==ETH_P_IP)
+ {
+ struct iphdr *s_ipv4=(struct iphdr *)MESA_jump_layer(sample_pkt, ADDR_TYPE_MAC, ADDR_TYPE_IPV4);
+ memcpy(buff+offset, (char *)s_ipv4, sizeof(struct iphdr));
+
+ s_ipv4=(struct iphdr *)(buff+offset);
+ offset+=sizeof(struct iphdr);
+
+ s_ipv4->ihl=5;
+ protocol=s_ipv4->protocol;
+ if(protocol==PROTO_TCP)
+ {
+ s_ipv4->tot_len=ntohs(sizeof(struct iphdr)+sizeof(struct tcphdr)+sizeof(struct smartoffload_report));
+ }
+ else
+ {
+ s_ipv4->tot_len=ntohs(sizeof(struct iphdr)+sizeof(struct udphdr)+sizeof(struct smartoffload_report));
+ }
+ }
+ else
+ {
+ struct ip6_hdr *s_ipv6=(struct ip6_hdr *)MESA_jump_layer(sample_pkt, ADDR_TYPE_MAC, ADDR_TYPE_IPV6);
+ memcpy(buff+offset, (char *)s_ipv6, sizeof(struct ip6_hdr));
+
+ s_ipv6=(struct ip6_hdr *)(buff+offset);
+ offset+=sizeof(struct ip6_hdr);
+
+ protocol=s_ipv6->ip6_ctlun.ip6_un1.ip6_un1_nxt;
+ if(protocol==PROTO_TCP)
+ {
+ s_ipv6->ip6_ctlun.ip6_un1.ip6_un1_plen=ntohs(sizeof(struct tcphdr)+sizeof(struct smartoffload_report));
+ }
+ else
+ {
+ s_ipv6->ip6_ctlun.ip6_un1.ip6_un1_plen=ntohs(sizeof(struct udphdr)+sizeof(struct smartoffload_report));
+ }
+ }
+
+ struct tcphdr *s_tcp=NULL;
+ struct udphdr *s_udp=NULL;
+
+ switch(protocol)
+ {
+ case PROTO_TCP:
+ s_tcp=(struct tcphdr *)MESA_jump_layer(sample_pkt, ADDR_TYPE_MAC, ADDR_TYPE_TCP);
+ memcpy(buff+offset, (char *)s_tcp, sizeof(struct tcphdr));
+ s_tcp=(struct tcphdr *)(buff+offset);
+ offset+=sizeof(struct tcphdr);
+ s_tcp->doff=5;
+ break;
+ case PROTO_UDP:
+ s_udp=(struct udphdr *)MESA_jump_layer(sample_pkt, ADDR_TYPE_MAC, ADDR_TYPE_UDP);
+ memcpy(buff+offset, (char *)s_udp, sizeof(struct udphdr));
+ s_udp=(struct udphdr *)(buff+offset);
+ offset+=sizeof(struct udphdr);
+ s_udp->len=ntohs(sizeof(struct udphdr)+sizeof(struct smartoffload_report));
+ break;
+ default:
+ return 0;
+ }
+
+ memcpy(buff+offset, (char *)report, sizeof(struct smartoffload_report));
+ offset+=sizeof(struct smartoffload_report);
+ mbufs->raw_pkt_len=offset;
+ mbufs->is_ctrlbuf=1;
+
+ return 1;
+}
+
+static int build_offload_report_packet(marsio_buff_t *mbufs[], int nr_mbufs, marsio_buff_t *real_pkt_array, int real_pkt_num, marsio_buff_t *offload_pkt)
+{
+ int i=0;
+ marsio_buff_t *offload_reverse_pkt=NULL;
+ struct smartoffload_report same={0}, reverse={0};
+
+ if(real_pkt_num==0)
+ {
+ return 0;
+ }
+
+ for(i=0; i< real_pkt_num; i++)
+ {
+ if(get_offload_report_dir(&real_pkt_array[i], offload_pkt))
+ {
+ same.magic=0x4d6a;
+ same.hit_cnts++;
+ same.hit_bytes+=real_pkt_array[i].raw_pkt_len;
+ }
+ else
+ {
+ reverse.magic=0x4d6a;
+ reverse.hit_cnts++;
+ reverse.hit_bytes+=real_pkt_array[i].raw_pkt_len;
+ if(offload_reverse_pkt==NULL)
+ {
+ offload_reverse_pkt=&real_pkt_array[i];
+ }
+ }
+ }
+
+ int mbufs_idx=0;
+ mbufs_idx+=build_simulated_packet(mbufs[mbufs_idx], offload_reverse_pkt, &reverse);
+ mbufs_idx+=build_simulated_packet(mbufs[mbufs_idx], offload_pkt, &same);
+
+ return mbufs_idx;
+}
+
+
static int fake_marsio_get_pkt_from_pcap(struct mr_instance * instance)
{
pcap_t *pcap_handle;
@@ -384,7 +550,7 @@ int marsio_buff_unset_metadata(marsio_buff_t *m, enum mr_buff_metadata_type type
void marsio_buff_free(struct mr_instance * instance, marsio_buff_t *marsio_buff[],unsigned int nr_mbufs, int socket_id, int thread_id)
{
- if(nr_mbufs > 1){
+ if(nr_mbufs > 1 && marsio_buff[0]->is_ctrlbuf!=1){
printf("marsio_buff_free error!\n");
marsio_buff[0] = NULL;
return;
@@ -535,20 +701,39 @@ int marsio_recv_burst(struct mr_vdev * vdev, queue_id_t qid, marsio_buff_t * mbu
//从pcap包里依次读取1个包
if(mrins->pcap_queue_index >= mrins->pkt_queue.pkt_num){/* pcap队列的包已经全部读取完了, 如果之前的包有错误, 其实走不到这里, 可以退出了 */
- if(GTEST_RESULT_NONE != fake_marsio_default_result_flag){
+ if(GTEST_RESULT_NONE != fake_marsio_default_result_flag && !vdev->mrins->is_offload){
MESA_handle_runtime_log(mrins->log_handle, RLOG_LV_INFO, "fake_marsio", "pcap process over, sendto check result:0x%x\n", fake_marsio_default_result_flag);
sendto_test_result(fake_marsio_default_result_flag);
if(fake_marsio_default_result_flag == GTEST_SAPP_SUCC){
fprintf(stderr, "marsio_recv_burst test success!\n");
}
}
+
+ if(vdev->mrins->is_offload)
+ {
+ sendto_test_result(GTEST_FAKE_MARSIO_SUCC);
+ fprintf(stderr, "\033[32mmarsio_offload_copy_packet_cb() test success!\033[0m\n");
+ }
+
exit(0);
}
- mbufs[0] = &mrins->pkt_queue.pkt_array[mrins->pcap_queue_index];
-
- mrins->pcap_queue_index++;
-
+ if(vdev->mrins->is_offload)
+ {
+ memset(vdev->mrins->offload_report_pkt, 0, 2*sizeof(marsio_buff_t));
+ mbufs[0]=&(vdev->mrins->offload_report_pkt[0]);
+ mbufs[1]=&(vdev->mrins->offload_report_pkt[1]);
+ int num=build_offload_report_packet(mbufs, 2, &mrins->pkt_queue.pkt_array[mrins->pcap_queue_index], mrins->pkt_queue.pkt_num-mrins->pcap_queue_index, &vdev->mrins->offload_pkt);
+ mrins->pcap_queue_index=mrins->pkt_queue.pkt_num;
+
+ return num;
+ }
+ else
+ {
+ mbufs[0] = &mrins->pkt_queue.pkt_array[mrins->pcap_queue_index];
+ mrins->pcap_queue_index++;
+ sleep(1);
+ }
return 1; /* 自测试, 每次只取1个包 */
}
@@ -596,6 +781,20 @@ int marsio_send_burst_with_options(
return marsio_send_burst(sendpath, sid, mbufs, nr_mbufs);
}
+marsio_buff_t *marsio_buff_malloc_smartoffload(struct mr_vdev *vdev, const char * pkt, unsigned int pkt_len)
+{
+ vdev->mrins->is_offload=1;
+ memcpy(vdev->mrins->offload_pkt.raw_pkt_data, pkt, pkt_len);
+ vdev->mrins->offload_pkt.raw_pkt_len=pkt_len;
+
+ return &(vdev->mrins->offload_pkt);
+}
+
+int marsio_buff_is_ctrlbuf(marsio_buff_t * m)
+{
+ return m->is_ctrlbuf;
+}
+
struct mr_instance * marsio_create(void)
{
struct mr_instance *mrins = (struct mr_instance *)calloc(1, sizeof(struct mr_instance));
diff --git a/module_test/src/gtest_fake_marsio_plug.cpp b/module_test/src/gtest_fake_marsio_plug.cpp
index 3addc72..05f1117 100644
--- a/module_test/src/gtest_fake_marsio_plug.cpp
+++ b/module_test/src/gtest_fake_marsio_plug.cpp
@@ -33,7 +33,7 @@
/*
- 底层是非对称mpls, 上层要识别为双向tcp流.
+ 底层是非对称mpls, 上层要识别为双向tcp�?
*/
extern "C" char fake_marsio_vlan_flipp_and_symmetric_mpls_entry(struct streaminfo *pstream,void **pme, int thread_seq, void *a_packet)
{
@@ -53,8 +53,8 @@ extern "C" char fake_marsio_vlan_flipp_and_symmetric_mpls_entry(struct streaminf
}
/*
- fake marsio插件错误结果立刻返回, 但是不返回正确结果,
- 在 fake_marsio_md5_tuple[] 里检查完后才能确定最终结果.
+ fake marsio插件错误结果立刻返回, 但是不返回正确结�?
+ �?fake_marsio_md5_tuple[] 里检查完后才能确定最终结�?
*/
}
@@ -80,4 +80,143 @@ extern "C" int fake_marsio_inject_tcp_entry(struct streaminfo *pstream,void **pm
return APP_STATE_GIVEME | APP_STATE_DROPPKT;
}
+extern "C" int fake_marsio_tcp_double_offload_entry(struct streaminfo *pstream,void **pme, int thread_seq, void *a_packet)
+{
+ static long long called_entry_cnt=0;
+
+ if(pstream->opstate==OP_STATE_PENDING)
+ {
+ called_entry_cnt=1;
+ }
+ else
+ {
+ called_entry_cnt++;
+ }
+
+ if(pstream->opstate==OP_STATE_CLOSE)
+ {
+ if((pstream->ptcpdetail->serverpktnum!=31)
+ || (pstream->ptcpdetail->serverbytes!=3440)
+ || (pstream->ptcpdetail->clientpktnum!=23)
+ || (pstream->ptcpdetail->clientbytes!=1950)
+ || called_entry_cnt!=2) {
+ SAPP_PLUG_LOG(RLOG_LV_FATAL,
+ "offload_report",
+ "\033[1;31;40mfake_marsio_offload_report_tcp_entry: check data correct result: serverpktnum=31,serverbytes=3440,clientpktnum=23,clientbytes=1950; real result: serverpktnum=%d,serverbytes=%d,clientpktnum=%d,clientbytes=%d !\033[0m\n",
+ pstream->ptcpdetail->serverpktnum,
+ pstream->ptcpdetail->serverbytes,
+ pstream->ptcpdetail->clientpktnum,
+ pstream->ptcpdetail->clientbytes
+ );
+
+ gtest_set_libsapp_devel_result(GTEST_SAPP_ERR);
+ assert(0);
+ }
+
+ long long offload_stream_cnt=0;
+ long long offload_inbound_pkt=0;
+ long long offload_inbound_byte=0;
+ long long offload_outbound_pkt=0;
+ long long offload_outbound_byte=0;
+ int len=sizeof(long long);
+
+ sapp_get_platform_opt(SPO_TOTAL_OFFLOAD_STREAM, (void *)&offload_stream_cnt, &len);
+ sapp_get_platform_opt(SPO_TOTAL_OFFLOAD_INBOUND_PKT, (void *)&offload_inbound_pkt, &len);
+ sapp_get_platform_opt(SPO_TOTAL_OFFLOAD_INBOUND_BYTE, (void *)&offload_inbound_byte, &len);
+ sapp_get_platform_opt(SPO_TOTAL_OFFLOAD_OUTBOUND_PKT, (void *)&offload_outbound_pkt, &len);
+ sapp_get_platform_opt(SPO_TOTAL_OFFLOAD_OUTBOUND_BYTE, (void *)&offload_outbound_byte, &len);
+
+ if(offload_stream_cnt!=1 ||
+ offload_inbound_pkt!=0 ||
+ offload_inbound_byte!=0 ||
+ offload_outbound_pkt!=50 ||
+ offload_outbound_byte!=7573) {
+ SAPP_PLUG_LOG(RLOG_LV_FATAL,
+ "offload_report",
+ "\033[1;31;40mfake_marsio_offload_report_tcp_entry: check data correct result: o_stream_cnt=1,o_inbound_pkt=0,o_inbound_byte=0,o_outbound_pkt=49,o_outbound_byte=7513; real result: o_stream_cnt=%d,o_inbound_pkt=%d,o_inbound_byte=%d,o_outbound_pkt=%d,o_outbound_byte=%d !\033[0m\n",
+ offload_stream_cnt,
+ offload_inbound_pkt,
+ offload_inbound_byte,
+ offload_outbound_pkt,
+ offload_outbound_byte
+ );
+
+ gtest_set_libsapp_devel_result(GTEST_SAPP_ERR);
+ assert(0);
+ }
+ }
+
+ return APP_STATE_GIVESTATE;
+}
+
+
+extern "C" int fake_marsio_udp_double_offload_entry(struct streaminfo *pstream,void **pme, int thread_seq, void *a_packet)
+{
+ static long long called_entry_cnt=0;
+
+ if(pstream->opstate==OP_STATE_PENDING)
+ {
+ called_entry_cnt=1;
+ }
+ else
+ {
+ called_entry_cnt++;
+ }
+
+ if(pstream->opstate==OP_STATE_CLOSE)
+ {
+ if((pstream->pudpdetail->serverpktnum!=647)
+ || (pstream->pudpdetail->serverbytes!=140937)
+ || (pstream->pudpdetail->clientpktnum!=665)
+ || (pstream->pudpdetail->clientbytes!=49383)
+ || called_entry_cnt!=2) {
+ SAPP_PLUG_LOG(RLOG_LV_FATAL,
+ "offload_report",
+ "\033[1;31;40mfake_marsio_offload_report_udp_entry: check data correct result: serverpktnum=31,serverbytes=3440,clientpktnum=23,clientbytes=1950; real result: serverpktnum=%d,serverbytes=%d,clientpktnum=%d,clientbytes=%d !\033[0m\n",
+ pstream->pudpdetail->serverpktnum,
+ pstream->pudpdetail->serverbytes,
+ pstream->pudpdetail->clientpktnum,
+ pstream->pudpdetail->clientbytes
+ );
+
+ gtest_set_libsapp_devel_result(GTEST_SAPP_ERR);
+ assert(0);
+ }
+
+ long long offload_stream_cnt=0;
+ long long offload_inbound_pkt=0;
+ long long offload_inbound_byte=0;
+ long long offload_outbound_pkt=0;
+ long long offload_outbound_byte=0;
+ int len=sizeof(long long);
+
+ sapp_get_platform_opt(SPO_TOTAL_OFFLOAD_STREAM, (void *)&offload_stream_cnt, &len);
+ sapp_get_platform_opt(SPO_TOTAL_OFFLOAD_INBOUND_PKT, (void *)&offload_inbound_pkt, &len);
+ sapp_get_platform_opt(SPO_TOTAL_OFFLOAD_INBOUND_BYTE, (void *)&offload_inbound_byte, &len);
+ sapp_get_platform_opt(SPO_TOTAL_OFFLOAD_OUTBOUND_PKT, (void *)&offload_outbound_pkt, &len);
+ sapp_get_platform_opt(SPO_TOTAL_OFFLOAD_OUTBOUND_BYTE, (void *)&offload_outbound_byte, &len);
+
+ if(offload_stream_cnt!=1 ||
+ offload_inbound_pkt!=0 ||
+ offload_inbound_byte!=0 ||
+ offload_outbound_pkt!=1311 ||
+ offload_outbound_byte!=245235) {
+ SAPP_PLUG_LOG(RLOG_LV_FATAL,
+ "offload_report",
+ "\033[1;31;40mfake_marsio_offload_report_udp_entry: check data correct result: o_stream_cnt=1,o_inbound_pkt=0,o_inbound_byte=0,o_outbound_pkt=49,o_outbound_byte=7513; real result: o_stream_cnt=%d,o_inbound_pkt=%d,o_inbound_byte=%d,o_outbound_pkt=%d,o_outbound_byte=%d !\033[0m\n",
+ offload_stream_cnt,
+ offload_inbound_pkt,
+ offload_inbound_byte,
+ offload_outbound_pkt,
+ offload_outbound_byte
+ );
+
+ gtest_set_libsapp_devel_result(GTEST_SAPP_ERR);
+ assert(0);
+ }
+ }
+
+ return APP_STATE_GIVESTATE;
+}
+
diff --git a/module_test/src/gtest_fake_marsio_run.cpp b/module_test/src/gtest_fake_marsio_run.cpp
index f389ed3..8f55f9b 100644
--- a/module_test/src/gtest_fake_marsio_run.cpp
+++ b/module_test/src/gtest_fake_marsio_run.cpp
@@ -30,8 +30,8 @@ static void fake_marsio_set_default_env(int mac_flapping_enable)
update_config_file("etc/sapp.toml", "l2_l3_tunnel_support", "1");
update_config_file("etc/sapp.toml", "overlay_mode", "none");
update_config_file_by_lastline("etc/sapp.toml", "packet_io.depolyment", "mode", "inline");
- update_config_file_by_lastNline("etc/sapp.toml", "packet_io.internal.interface", 1, "name", "lo"); /* 此处name叫什么名其实无所谓了, 并不是真正从网卡获取数据包 */
- update_config_file_by_lastNline("etc/sapp.toml", "packet_io.internal.interface", 2, "name", "lo"); /* 此处name叫什么名其实无所谓了, 并不是真正从网卡获取数据包 */
+ update_config_file_by_lastNline("etc/sapp.toml", "packet_io.internal.interface", 1, "name", "lo"); /* 此处name叫什么名其实无所谓了, 并不是真正从网卡获取数据�?*/
+ update_config_file_by_lastNline("etc/sapp.toml", "packet_io.internal.interface", 2, "name", "lo"); /* 此处name叫什么名其实无所谓了, 并不是真正从网卡获取数据�?*/
update_config_file_by_lastNline("etc/sapp.toml", "packet_io.internal.interface", 1, "type", "marsio");
update_config_file_by_lastNline("etc/sapp.toml", "packet_io.internal.interface", 2, "type", "marsio");
@@ -49,9 +49,9 @@ void fake_marsio_vlan_flipping_run(void)
{
fake_marsio_set_default_env(0);
- update_plugin_inf("TCP_ALL", "void_entry"); /* 挂个空插件 */
+ update_plugin_inf("TCP_ALL", "void_entry"); /* 挂个空插�?*/
- set_pcap_dumpfile("for_gtest_only/fake_marsio/tcp_vlan_flip_no_mac_flip.pcap"); /* 回放一个普通tcp包即可, 会在fake marsio fake_marsio_md5_tuple[] 相关检查函数里验证 */
+ set_pcap_dumpfile("for_gtest_only/fake_marsio/tcp_vlan_flip_no_mac_flip.pcap"); /* 回放一个普通tcp包即�? 会在fake marsio fake_marsio_md5_tuple[] 相关检查函数里验证 */
ASSERT_EQ(file_md5_checksum("dumpfile", "b621d91181eddfe028dab095df530824"), 0);
call_libsapp_devel_with_args(1, sapp_online_start_args);
@@ -63,9 +63,9 @@ void fake_marsio_vlan_flipp_and_mac_flip_run(void)
{
fake_marsio_set_default_env(1);
- update_plugin_inf("TCP_ALL", "void_entry"); /* 挂个空插件 */
+ update_plugin_inf("TCP_ALL", "void_entry"); /* 挂个空插�?*/
- set_pcap_dumpfile("for_gtest_only/fake_marsio/tcp_vlan_flip_and_mac_flip.pcap"); /* 回放一个普通tcp包即可, 会在fake marsio fake_marsio_md5_tuple[] 相关检查函数里验证 */
+ set_pcap_dumpfile("for_gtest_only/fake_marsio/tcp_vlan_flip_and_mac_flip.pcap"); /* 回放一个普通tcp包即�? 会在fake marsio fake_marsio_md5_tuple[] 相关检查函数里验证 */
ASSERT_EQ(file_md5_checksum("dumpfile", "5a588633faa677283fa32cd7c5f3cc97"),0);
call_libsapp_devel_with_args(1, sapp_online_start_args);
@@ -73,7 +73,7 @@ void fake_marsio_vlan_flipp_and_mac_flip_run(void)
-/* vlan fliping and asymmetric mpls 0vs1层 功能测试 */
+/* vlan fliping and asymmetric mpls 0vs1�?功能测试 */
void fake_marsio_vlan_flipp_and_symmetric_mpls0vs1_run(void)
{
fake_marsio_set_default_env(1);
@@ -87,7 +87,7 @@ void fake_marsio_vlan_flipp_and_symmetric_mpls0vs1_run(void)
}
-/* vlan fliping and asymmetric mpls 1vs2层 功能测试 */
+/* vlan fliping and asymmetric mpls 1vs2�?功能测试 */
void fake_marsio_vlan_flipp_and_symmetric_mpls1vs2_run(void)
{
fake_marsio_set_default_env(1);
@@ -101,15 +101,15 @@ void fake_marsio_vlan_flipp_and_symmetric_mpls1vs2_run(void)
}
-/* 不开etc/asymmetric_addr_layer.conf->ethernet, 但是开启vlan_flipping和mac_flipping, 注入数据包测试
- 模拟K现场模式, 这个测试用例理论上是错误的!
+/* 不开etc/asymmetric_addr_layer.conf->ethernet, 但是开启vlan_flipping和mac_flipping, 注入数据包测�?
+ 模拟K现场模式, 这个测试用例理论上是错误�?
*/
void fake_marsio_vlan_mac_flipping_inject_run(int is_asymmetric)
{
fake_marsio_set_default_env(1);
- /* 两个测试用例使用一个pcap包, 一个插件, 仅测试是否开启 asymmetric addr时, 不同的结果 */
+ /* 两个测试用例使用一个pcap�? 一个插�? 仅测试是否开�?asymmetric addr�? 不同的结�?*/
if(is_asymmetric){
set_default_asymmetric_addr_layer_conf("ethernet[*]\nvlan[*]\nmpls[*]\ngre[*]\ngtp[*]\n\n"); /* 启用asymmetric addr */
}else{
@@ -123,3 +123,38 @@ void fake_marsio_vlan_mac_flipping_inject_run(int is_asymmetric)
call_libsapp_devel_with_args(1, sapp_online_start_args);
}
+
+void fake_marsio_tcp_double_offload_report_run(void )
+{
+ fake_marsio_set_default_env(1);
+ update_config_file("etc/sapp.toml", "timeout", "60");
+ update_config_file("etc/sapp.toml", "prometheus_enabled", "0");
+ update_config_file("etc/sapp.toml", "meaningful_statistics_minimum_pkt", "0");
+ update_config_file("etc/sapp.toml", "meaningful_statistics_minimum_byte", "0");
+ update_config_file_by_lastline("etc/sapp.toml", "packet_io.depolyment", "mode", "mirror");
+
+ update_plugin_inf("TCP", "fake_marsio_tcp_double_offload_entry");
+
+ set_pcap_dumpfile("for_gtest_only/fake_marsio/tcp_offload_report_websocket_tls.pcap");
+ ASSERT_EQ(file_md5_checksum("dumpfile", "d333d356e1a8146adb390ed66462a0ed"),0);
+
+ call_libsapp_devel_with_args(1, sapp_online_start_args);
+}
+
+void fake_marsio_udp_double_offload_report_run(void )
+{
+ fake_marsio_set_default_env(1);
+ update_config_file("etc/sapp.toml", "timeout", "60");
+ update_config_file("etc/sapp.toml", "prometheus_enabled", "0");
+ update_config_file("etc/sapp.toml", "meaningful_statistics_minimum_pkt", "0");
+ update_config_file("etc/sapp.toml", "meaningful_statistics_minimum_byte", "0");
+ update_config_file_by_lastline("etc/sapp.toml", "packet_io.depolyment", "mode", "mirror");
+
+ update_plugin_inf("UDP", "fake_marsio_udp_double_offload_entry");
+
+ set_pcap_dumpfile("for_gtest_only/fake_marsio/udp-offload-report-111.161.107.181.8000-192.168.210.153.4001.pcap");
+ ASSERT_EQ(file_md5_checksum("dumpfile", "328951b2b04af765e6a0a7fe34ee29ad"), 0);
+
+ call_libsapp_devel_with_args(1, sapp_online_start_args);
+}
+
diff --git a/module_test/src/gtest_main.cpp b/module_test/src/gtest_main.cpp
index 1e0d38d..1ef0081 100644
--- a/module_test/src/gtest_main.cpp
+++ b/module_test/src/gtest_main.cpp
@@ -2123,6 +2123,21 @@ TEST(fake_marsio, vlan_mac_flip_inject_with_asymmetric)
EXPECT_EXIT(fake_marsio_vlan_mac_flipping_inject_run(1), testing::KilledBySignal(SIGABRT), "test success");
}
+#define _fake_marsio_tcp_double_offload_report 1
+TEST(fake_marsio, tcp_double_offload_report)
+{
+// fake_marsio_tcp_double_offload_report_run();
+ EXPECT_EXIT(fake_marsio_tcp_double_offload_report_run(), testing::KilledBySignal(SIGABRT), "test success");
+ //ASSERT_EQ(GTEST_SAPP_SUCC, gtest_get_libsapp_devel_result());
+}
+
+#define _fake_marsio_udp_double_offload_report 1
+TEST(fake_marsio, udp_double_offload_report)
+{
+ //fake_marsio_udp_double_offload_report_run();
+ EXPECT_EXIT(fake_marsio_udp_double_offload_report_run(), testing::KilledBySignal(SIGABRT), "test success");
+ //ASSERT_EQ(GTEST_SAPP_SUCC, gtest_get_libsapp_devel_result());
+}
/************************* fake marsio test end ***********************/
diff --git a/module_test/src/gtest_sapp_fun.h b/module_test/src/gtest_sapp_fun.h
index 27a5478..10559a4 100644
--- a/module_test/src/gtest_sapp_fun.h
+++ b/module_test/src/gtest_sapp_fun.h
@@ -556,6 +556,10 @@ void fake_marsio_vlan_flipp_and_mac_flip_run(void);
void fake_marsio_vlan_flipp_and_symmetric_mpls0vs1_run(void);
void fake_marsio_vlan_flipp_and_symmetric_mpls1vs2_run(void);
void fake_marsio_vlan_mac_flipping_inject_run(int is_asymmetric);
+void fake_marsio_tcp_double_offload_report_run(void);
+void fake_marsio_udp_double_offload_report_run(void);
+
+
/**************************** proxy *************************************/
diff --git a/module_test/src/gtest_sapp_tcp_plug.cpp b/module_test/src/gtest_sapp_tcp_plug.cpp
index 57b9590..a555c79 100644
--- a/module_test/src/gtest_sapp_tcp_plug.cpp
+++ b/module_test/src/gtest_sapp_tcp_plug.cpp
@@ -2394,7 +2394,7 @@ extern "C" char tcp_offload_1st_givestate_entry(struct streaminfo *pstream,void
{
if((37 == pdetail->clientpktnum)
&&(11345 == pdetail->clientbytes)
- &&(30 == pdetail->serverpktnum)
+ &&(31 == pdetail->serverpktnum)
&&(2329 == pdetail->serverbytes))
{
SAPP_PLUG_LOG(RLOG_LV_INFO, "tcpall.offload", "\033[32m tcpall_simple() test succ!\033[0m\n");
diff --git a/src/dealpkt/deal_tcp.c b/src/dealpkt/deal_tcp.c
index ea606ac..c58bffc 100644
--- a/src/dealpkt/deal_tcp.c
+++ b/src/dealpkt/deal_tcp.c
@@ -86,6 +86,215 @@ inline static int after (u_int seq1, u_int seq2)
return ((int) (seq2 - seq1) < 0);
}
+static int is_opposite_tcp_addr(UINT32 clientpktnum, UINT32 serverpktnum, char curdir)
+{
+ if(curdir==DIR_S2C)
+ {
+ if(clientpktnum == 0) /* ��ǰ����ĵ�һ����, ���Ը��µײ������ĵ����ַ��Ϣ(��MPLS, GTP) */
+ {
+ return 1;
+ }
+ }
+ else
+ {
+ if(serverpktnum==0) /* ��ǰ����ĵ�һ����, ���Ը��µײ������ĵ����ַ��Ϣ(��MPLS, GTP) */
+ {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static void tcp_update_pdetail_stat(struct tcpdetail *pdetail, char curdir, UINT64 pkts, UINT64 payload_bytes)
+{
+ if(curdir==DIR_S2C)
+ {
+ pdetail->clientpktnum+=(UINT32)pkts;
+ pdetail->clientbytes+=(UINT32)payload_bytes;
+ }
+ else
+ {
+ pdetail->serverpktnum+=(UINT32)pkts;
+ pdetail->serverbytes+=(UINT32)payload_bytes;
+ }
+}
+
+static int tcp_update_flow_stat(struct tcp_flow_stat *flow_stat, char curdir, UINT64 pkts, UINT64 payload_bytes, UINT64 bytes)
+{
+ /* flow_stat��ȫ����״̬��¼, �������ش����������� */
+ if(G_TCP_FLOW_STAT_PROJECT_ID==-1)
+ {
+ return ;
+ }
+
+ if(DIR_C2S==curdir)
+ {
+ flow_stat->C2S_all_pkt+=(UINT32)pkts;
+ flow_stat->C2S_all_byte+=payload_bytes;
+ flow_stat->C2S_all_byte_raw+=bytes;
+ }
+ else
+ {
+ flow_stat->S2C_all_pkt+=(UINT32)pkts;
+ flow_stat->S2C_all_byte+=payload_bytes;
+ flow_stat->S2C_all_byte_raw+=bytes;
+ }
+}
+
+static int tcp_update_deduce_flow_stat(struct tcp_flow_stat *deduce_flow_stat, char curdir, UINT64 pkts, UINT64 bytes)
+{
+ if(G_TCP_DEDUCE_FLOW_STAT_PROJECT_ID!=-1)
+ {
+ return ;
+ }
+
+ if(DIR_C2S==curdir)
+ {
+ deduce_flow_stat->C2S_all_pkt+=(UINT32)pkts;
+ deduce_flow_stat->C2S_all_byte+=bytes;
+ }
+ else
+ {
+ deduce_flow_stat->S2C_all_pkt+=(UINT32)pkts;
+ deduce_flow_stat->S2C_all_byte+=bytes;
+ }
+
+}
+
+static int is_recv_all_tcp_smartoffload_report(struct streaminfo_private *pstream_pr)
+{
+ struct streaminfo *pstream = &pstream_pr->stream_public;
+ struct tcpdetail_private *pdetail_pr =(struct tcpdetail_private*)(pstream->pdetail);
+
+ switch(pstream->dir)
+ {
+ case DIR_C2S:
+ if(pdetail_pr->c2s_smartoffload_report==1)
+ {
+ return 1;
+ }
+ break;
+ case DIR_S2C:
+ if(pdetail_pr->s2c_smartoffload_report==1)
+ {
+ return 1;
+ }
+ break;
+ case DIR_DOUBLE:
+ if(pdetail_pr->c2s_smartoffload_report==1 && pdetail_pr->s2c_smartoffload_report)
+ {
+ return 1;
+ }
+ break;
+ }
+
+ return 0;
+}
+
+static void tcp_update_smartoffload_report(struct streaminfo_private *pstream_pr, const raw_pkt_t *p_raw_pkt, char *payload, int payload_len)
+{
+ struct streaminfo *pstream = &pstream_pr->stream_public;
+ struct tcpdetail *pdetail =(struct tcpdetail *)pstream->ptcpdetail;
+ struct tcpdetail_private *pdetail_pr =(struct tcpdetail_private*)(pstream->pdetail);
+ sapp_gval_mthread_sys_stat_t *local_sys_stat = &sapp_global_val->mthread_volatile[pstream->threadnum]->sys_stat;
+
+ struct smartoffload_report *report=(struct smartoffload_report *)payload;
+
+ int l4_hdr_len=p_raw_pkt->raw_pkt_len - payload_len;
+
+ if(pdetail_pr->c2s_smartoffload_report==0 && pdetail_pr->s2c_smartoffload_report==0)
+ {
+ local_sys_stat->count[SAPP_STAT_OFFLOAD_STREAM]++;
+ }
+
+ if(p_raw_pkt->route_dir == sapp_global_val->config.packet_io.inbound_route_dir)
+ {
+ local_sys_stat->count[SAPP_STAT_OFFLOAD_INBOUND]+=report->hit_cnts;
+ local_sys_stat->length[SAPP_STAT_OFFLOAD_INBOUND]+=report->hit_bytes;
+ }
+ else
+ {
+ local_sys_stat->count[SAPP_STAT_OFFLOAD_OUTBOUND]+=report->hit_cnts;
+ local_sys_stat->length[SAPP_STAT_OFFLOAD_OUTBOUND]+=report->hit_bytes;
+ }
+
+ local_sys_stat->count[SAPP_STAT_TCP_OFFLOAD_PKTS]+=report->hit_cnts;
+ local_sys_stat->length[SAPP_STAT_TCP_OFFLOAD_BYTES]+=(report->hit_bytes-report->hit_cnts*l4_hdr_len);
+
+ if(pstream->curdir==DIR_C2S)
+ {
+ pdetail_pr->c2s_smartoffload_report=1;
+ }
+ else
+ {
+ pdetail_pr->s2c_smartoffload_report=1;
+ }
+
+ tcp_update_pdetail_stat(pdetail, pstream->curdir, report->hit_cnts, report->hit_bytes - report->hit_cnts*l4_hdr_len);
+ tcp_update_flow_stat(pdetail_pr->flow_stat, pstream->curdir, report->hit_cnts, report->hit_bytes - report->hit_cnts*l4_hdr_len, report->hit_bytes);
+ tcp_update_deduce_flow_stat(pdetail_pr->deduce_flow_stat, pstream->curdir, report->hit_cnts, report->hit_bytes);
+}
+
+static int tcp_try_call_smartoffload(struct streaminfo_private *pstream_pr, const raw_pkt_t *raw_pkt, UINT32 payload_bytes)
+{
+ struct streaminfo *pstream = &pstream_pr->stream_public;
+ struct tcpdetail_private *pdetail_pr =(struct tcpdetail_private*)(pstream->pdetail);
+
+ if( pdetail_pr->offload_stream_flag!=(SMART_OFFLOAD_FLAG_TCP|SMART_OFFLOAD_FLAG_TCPALL) ||
+ sapp_global_val->config.stream.tcp.meaningful_statistics_minimum_pkt >= (pstream->ptcpdetail->serverpktnum+pstream->ptcpdetail->clientpktnum)
+ )
+ {
+ return 0;
+ }
+
+ sapp_gval_mthread_sys_stat_t *local_sys_stat = &sapp_global_val->mthread_volatile[pstream->threadnum]->sys_stat;
+
+ if(pstream->curdir==DIR_C2S)
+ {
+ if(g_CurrentTime <= pdetail_pr->offload_c2s_timestamp_s)
+ {
+ local_sys_stat->count[SAPP_STAT_TCP_OFFLOAD_PKTS]++;
+ local_sys_stat->length[SAPP_STAT_TCP_OFFLOAD_BYTES]+=payload_bytes;
+ return 1;
+ }
+ }
+ else
+ {
+ if(g_CurrentTime <= pdetail_pr->offload_s2c_timestamp_s)
+ {
+ local_sys_stat->count[SAPP_STAT_TCP_OFFLOAD_PKTS]++;
+ local_sys_stat->length[SAPP_STAT_TCP_OFFLOAD_BYTES]+=payload_bytes;
+ return 1;
+ }
+ }
+
+ if(pdetail_pr->c2s_smartoffload==0 && pdetail_pr->s2c_smartoffload==0)
+ {
+ local_sys_stat->count[SAPP_STAT_TCP_OFFLOAD_STREAM]++;
+ }
+ else
+ {
+ local_sys_stat->count[SAPP_STAT_TCP_OFFLOAD_PKTS]++;
+ local_sys_stat->length[SAPP_STAT_TCP_OFFLOAD_BYTES]+=payload_bytes;
+ }
+
+ if(pstream->curdir==DIR_C2S)
+ {
+ pdetail_pr->c2s_smartoffload=1;
+ pdetail_pr->offload_c2s_timestamp_s=g_CurrentTime;
+ }
+ else
+ {
+ pdetail_pr->s2c_smartoffload=1;
+ pdetail_pr->offload_s2c_timestamp_s=g_CurrentTime;
+ }
+
+ MESA_send_smart_offload(pstream, (const void *)raw_pkt, pstream->threadnum);
+
+ return 1;
+}
+
static int checkcreatlinkseq(struct streaminfo_private*pstream_pr,int this_seq)
{
int curseq=0;
@@ -2702,7 +2911,6 @@ static int deal_tcp_stream(struct streamindex *pindex, const void *this_iphdr, s
int retAll=PASS;
struct streaminfo_private *pstream_pr = &pindex->stream;
struct streaminfo *pstream = &pstream_pr->stream_public;
- int try_to_update_addr_info = 0;
int call_tcpall_after_reset = 0; /* 2019-10-18 lijia modify, ��ǰ����reset֮��,��֤�ȵ���tcpall,�ٵ���tcp */
sapp_gval_mthread_sys_stat_t *local_sys_stat = &sapp_global_val->mthread_volatile[pstream->threadnum]->sys_stat;
@@ -2810,13 +3018,7 @@ static int deal_tcp_stream(struct streamindex *pindex, const void *this_iphdr, s
ret = tcp_process_newstreambydata(pindex_tcp,this_iphdr, this_tcphdr,tcplen,raw_pkt);
}
- pdetail_pr =(struct tcpdetail_private*)(pstream->pdetail);
- if(pdetail_pr->offload_stream_flag==(SMART_OFFLOAD_FLAG_TCP|SMART_OFFLOAD_FLAG_TCPALL) && (g_CurrentTime > pdetail_pr->offload_stream_timestamp_s))
- {
- local_sys_stat->count[SAPP_STAT_TCP_OFFLOAD_STREAM]++;
- MESA_send_smart_offload(pstream, (const void *)raw_pkt, pstream->threadnum);
- pdetail_pr->offload_stream_timestamp_s = g_CurrentTime;
- }
+ tcp_try_call_smartoffload(pstream_pr, raw_pkt, tcplen);
}
}
return ret;
@@ -2892,54 +3094,50 @@ static int deal_tcp_stream(struct streamindex *pindex, const void *this_iphdr, s
return DROP;
}
- if(pstream->curdir==DIR_S2C)
+ if(raw_pkt->is_offload_report)
{
- if(pdetail->clientpktnum == 0) /* ��ǰ����ĵ�һ����, ���Ը��µײ������ĵ����ַ��Ϣ(��MPLS, GTP) */
- {
- try_to_update_addr_info = 1;
+ if(tcplen!=sizeof(struct smartoffload_report))
+ {
+ sapp_runtime_log(RLOG_LV_FATAL,
+ "UDP stream offload report addr: %s, but sizeof(struct smartoffload_report)=%d, udp payload len=%d , return PASS.",
+ printaddr(&pstream->addr, pstream->threadnum),
+ sizeof(struct smartoffload_report),
+ tcplen
+ );
+ return PASS;
}
- pdetail->clientbytes+=tcplen;
- pdetail->clientpktnum++;
- }
- else
- {
- if(pdetail->serverpktnum == 0) /* ��ǰ����ĵ�һ����, ���Ը��µײ������ĵ����ַ��Ϣ(��MPLS, GTP) */
+
+ tcp_update_smartoffload_report(pstream_pr, raw_pkt, (char*)(this_tcphdr) + 4 * this_tcphdr->th_off, tcplen);
+ if(is_recv_all_tcp_smartoffload_report(pstream_pr))
{
- try_to_update_addr_info = 1;
+ pstream->opstate=OP_STATE_CLOSE;
+ pdetail->pdata=NULL;
+ pdetail->datalen=0;
+ stream_process_tcp(pstream, NULL, NULL, NULL, &(pdetail_pr->apme),&(pstream->opstate));
+ pdetail_pr->apme=NULL;
+
+ pstream->pktstate=OP_STATE_CLOSE;
+ stream_process_tcp_allpkt(pstream, NULL, NULL, NULL,&(pdetail_pr->pAllpktpme),&(pstream->pktstate));
+ pdetail_pr->pAllpktpme=NULL;
+
+ tcp_update_should_close_reason_stat(pstream->threadnum);
+ tcp_change_stream_tonouse(pindex);
}
- pdetail->serverbytes+=tcplen;
- pdetail->serverpktnum++;
+
+ return PASS;
}
- if(try_to_update_addr_info == 1)
+ if(is_opposite_tcp_addr(pdetail->clientpktnum, pdetail->serverpktnum, pstream->curdir))
{
update_opposite_addr_info(pstream_pr, (struct streaminfo_private *)(pstream_pr->pfather_pr),
- (struct streaminfo_private *)(pindex->stream.pfather_pr), pstream->curdir);
+ (struct streaminfo_private *)(pindex->stream.pfather_pr), pstream->curdir);
}
-
+
+ tcp_update_pdetail_stat(pdetail, pstream->curdir, 1, (UINT64)tcplen);
/* flow_stat��ȫ����״̬��¼, �������ش����������� */
- if(G_TCP_FLOW_STAT_PROJECT_ID != -1){
- if(DIR_C2S == pstream->curdir){
- pdetail_pr->flow_stat->C2S_all_pkt++;
- pdetail_pr->flow_stat->C2S_all_byte += tcplen;
- pdetail_pr->flow_stat->C2S_all_byte_raw += raw_pkt->raw_pkt_len - raw_pkt->overlay_layer_bytes;
- }else{
- pdetail_pr->flow_stat->S2C_all_pkt++;
- pdetail_pr->flow_stat->S2C_all_byte += tcplen;
- pdetail_pr->flow_stat->S2C_all_byte_raw += raw_pkt->raw_pkt_len - raw_pkt->overlay_layer_bytes;
- }
- }
-
- if(G_TCP_DEDUCE_FLOW_STAT_PROJECT_ID != -1){
- if(DIR_C2S == pstream->curdir){
- pdetail_pr->deduce_flow_stat->C2S_all_pkt++;
- pdetail_pr->deduce_flow_stat->C2S_all_byte += tcplen;
- }else{
- pdetail_pr->deduce_flow_stat->S2C_all_pkt++;
- pdetail_pr->deduce_flow_stat->S2C_all_byte += tcplen;
- }
- }
-
+ tcp_update_flow_stat(pdetail_pr->flow_stat, pstream->curdir, 1, (UINT64)tcplen, (UINT64)(raw_pkt->raw_pkt_len - raw_pkt->overlay_layer_bytes));
+ tcp_update_deduce_flow_stat(pdetail_pr->deduce_flow_stat, pstream->curdir, 1, (UINT64)tcplen);
+
update_polling_inject_context(SAPP_MEM_DYN_TCP_POLLING_RAW_PKT, pstream_pr, raw_pkt);
/* note: reset�����ü���, ����clientbytes+=, clientpktnum++����֮�� */
@@ -2972,13 +3170,8 @@ static int deal_tcp_stream(struct streamindex *pindex, const void *this_iphdr, s
}
else
{
- if(pdetail_pr->offload_stream_flag==(SMART_OFFLOAD_FLAG_TCP|SMART_OFFLOAD_FLAG_TCPALL) && (g_CurrentTime > pdetail_pr->offload_stream_timestamp_s))
+ if(tcp_try_call_smartoffload(pstream_pr, raw_pkt, tcplen))
{
- local_sys_stat->count[SAPP_STAT_TCP_OFFLOAD_PKTS]++;
- local_sys_stat->length[SAPP_STAT_TCP_OFFLOAD_BYTES]+= tcplen;
-
- MESA_send_smart_offload(pstream, (const void *)raw_pkt, pstream->threadnum);
- pdetail_pr->offload_stream_timestamp_s = g_CurrentTime;
return PASS;
}
@@ -3034,7 +3227,7 @@ static int deal_tcp_stream(struct streamindex *pindex, const void *this_iphdr, s
else
{
pdetail->pdata=(char*)(this_tcphdr) + 4 * this_tcphdr->th_off;
- pdetail->datalen = tcplen;
+ pdetail->datalen = tcplen;
}
retAll=stream_process_tcp_allpkt(pstream,this_iphdr, (const void *)this_tcphdr, raw_pkt,&(pdetail_pr->pAllpktpme),&(pstream->pktstate));
pdetail->pdata=NULL;
@@ -3047,11 +3240,9 @@ static int deal_tcp_stream(struct streamindex *pindex, const void *this_iphdr, s
}
}
- if(pdetail_pr->offload_stream_flag==(SMART_OFFLOAD_FLAG_TCP|SMART_OFFLOAD_FLAG_TCPALL) && DROP!=ret && (g_CurrentTime > pdetail_pr->offload_stream_timestamp_s))
+ if(DROP!=ret && (pstream->pktstate!=OP_STATE_CLOSE || pstream->opstate!=OP_STATE_CLOSE))
{
- local_sys_stat->count[SAPP_STAT_TCP_OFFLOAD_STREAM]++;
- MESA_send_smart_offload(pstream, (const void *)raw_pkt, pstream->threadnum);
- pdetail_pr->offload_stream_timestamp_s = g_CurrentTime;
+ tcp_try_call_smartoffload(pstream_pr, raw_pkt, 0);
}
fun_exit:
diff --git a/src/dealpkt/deal_udp.c b/src/dealpkt/deal_udp.c
index 525245f..bde1e3a 100644
--- a/src/dealpkt/deal_udp.c
+++ b/src/dealpkt/deal_udp.c
@@ -22,6 +22,192 @@ extern int g_overlay_layer_set[__ADDR_TYPE_MAX][SAPP_SUPPORT_LAYER_NUM_MAX];
int G_UDP_FLOW_STAT_PROJECT_ID = -1;
int G_UDP_TEREDO_IDENTIFY_PROJECT_ID = -1;
+static int is_opposite_udp_addr(UINT32 clientpktnum, UINT32 serverpktnum, char curdir)
+{
+ if(curdir==DIR_S2C)
+ {
+ if(clientpktnum == 0) /* ��ǰ����ĵ�һ����, ���Ը��µײ������ĵ����ַ��Ϣ(��MPLS, GTP) */
+ {
+ return 1;
+ }
+ }
+ else
+ {
+ if(serverpktnum==0) /* ��ǰ����ĵ�һ����, ���Ը��µײ������ĵ����ַ��Ϣ(��MPLS, GTP) */
+ {
+ return 1;
+ }
+ }
+
+ return 0;
+}
+
+static void udp_update_pdetail_stat(struct udpdetail *pdetail, char curdir, UINT64 pkts, UINT64 payload_bytes)
+{
+ if(curdir==DIR_S2C)
+ {
+ pdetail->clientpktnum+=(UINT32)pkts;
+ pdetail->clientbytes+=(UINT32)payload_bytes;
+ }
+ else
+ {
+ pdetail->serverpktnum+=(UINT32)pkts;
+ pdetail->serverbytes+=(UINT32)payload_bytes;
+ }
+}
+
+static int udp_update_flow_stat(struct udp_flow_stat *flow_stat, char curdir, UINT64 pkts, UINT64 payload_bytes, UINT64 bytes)
+{
+ /* flow_stat��ȫ����״̬��¼, �������ش����������� */
+ if(G_UDP_FLOW_STAT_PROJECT_ID==-1)
+ {
+ return ;
+ }
+
+ if(DIR_C2S==curdir)
+ {
+ flow_stat->C2S_pkt+=(UINT32)pkts;
+ flow_stat->C2S_byte+=payload_bytes;
+ flow_stat->C2S_all_byte_raw+=bytes;
+ }
+ else
+ {
+ flow_stat->S2C_pkt+=(UINT32)pkts;
+ flow_stat->S2C_byte+=payload_bytes;
+ flow_stat->S2C_all_byte_raw+=bytes;
+ }
+}
+
+static int is_recv_all_udp_smartoffload_report(struct streaminfo_private *pstream_pr)
+{
+ struct streaminfo *pstream = &pstream_pr->stream_public;
+ struct udpdetail_private *pdetail_pr =(struct udpdetail_private*)(pstream->pdetail);
+
+ switch(pstream->dir)
+ {
+ case DIR_C2S:
+ if(pdetail_pr->c2s_smartoffload_report==1)
+ {
+ return 1;
+ }
+ break;
+ case DIR_S2C:
+ if(pdetail_pr->s2c_smartoffload_report==1)
+ {
+ return 1;
+ }
+ break;
+ case DIR_DOUBLE:
+ if(pdetail_pr->c2s_smartoffload_report==1 && pdetail_pr->s2c_smartoffload_report)
+ {
+ return 1;
+ }
+ break;
+ }
+
+ return 0;
+}
+
+static void udp_update_smartoffload_report(struct streaminfo *pstream, const raw_pkt_t *p_raw_pkt, char *payload, int payload_len)
+{
+ struct udpdetail_private *pdetail_pr =(struct udpdetail_private*)(pstream->pdetail);
+ struct udpdetail *pdetail =(struct udpdetail *)(&pdetail_pr->udpdetail_public);
+
+ int l4_hdr_len=p_raw_pkt->raw_pkt_len -p_raw_pkt->overlay_layer_bytes - payload_len;
+ struct smartoffload_report *report=(struct smartoffload_report *)(payload);
+ sapp_gval_mthread_sys_stat_t *local_sys_stat = &sapp_global_val->mthread_volatile[pstream->threadnum]->sys_stat;
+
+ if(pdetail_pr->c2s_smartoffload_report==0 && pdetail_pr->s2c_smartoffload_report==0)
+ {
+ local_sys_stat->count[SAPP_STAT_OFFLOAD_STREAM]++;
+ }
+
+ if(p_raw_pkt->route_dir == sapp_global_val->config.packet_io.inbound_route_dir)
+ {
+ local_sys_stat->count[SAPP_STAT_OFFLOAD_INBOUND]+=report->hit_cnts;
+ local_sys_stat->length[SAPP_STAT_OFFLOAD_INBOUND]+=report->hit_bytes;
+ }
+ else
+ {
+ local_sys_stat->count[SAPP_STAT_OFFLOAD_OUTBOUND]+=report->hit_cnts;
+ local_sys_stat->length[SAPP_STAT_OFFLOAD_OUTBOUND]+=report->hit_bytes;
+ }
+
+ local_sys_stat->count[SAPP_STAT_UDP_OFFLOAD_PKTS]+=report->hit_cnts;
+ local_sys_stat->length[SAPP_STAT_UDP_OFFLOAD_BYTES]+=(report->hit_bytes-report->hit_cnts*l4_hdr_len);
+
+ if(pstream->curdir==DIR_C2S)
+ {
+ pdetail_pr->c2s_smartoffload_report=1;
+ }
+ else
+ {
+ pdetail_pr->s2c_smartoffload_report=1;
+ }
+
+ udp_update_pdetail_stat(pdetail, pstream->curdir, report->hit_cnts, report->hit_bytes - report->hit_cnts*l4_hdr_len);
+ udp_update_flow_stat(pdetail_pr->flow_stat, pstream->curdir, report->hit_cnts, report->hit_bytes - report->hit_cnts*l4_hdr_len, report->hit_bytes);
+}
+
+static int udp_try_call_smartoffload(struct streaminfo *pstream, const raw_pkt_t *raw_pkt, UINT32 payload_bytes)
+{
+ struct udpdetail_private *pdetail_pr =(struct udpdetail_private*)(pstream->pdetail);
+ sapp_gval_mthread_sys_stat_t *local_sys_stat = &sapp_global_val->mthread_volatile[pstream->threadnum]->sys_stat;
+
+ if( pdetail_pr->offload_stream_flag!=(SMART_OFFLOAD_FLAG_UDP) ||
+ sapp_global_val->config.stream.udp.meaningful_statistics_minimum_pkt >= (pstream->pudpdetail->serverpktnum+pstream->pudpdetail->clientpktnum)
+ )
+ {
+ return 0;
+ }
+
+ if(pstream->curdir==DIR_C2S)
+ {
+ if(g_CurrentTime <= pdetail_pr->offload_c2s_timestamp_s)
+ {
+ local_sys_stat->count[SAPP_STAT_UDP_OFFLOAD_PKTS]++;
+ local_sys_stat->length[SAPP_STAT_UDP_OFFLOAD_BYTES]+=payload_bytes;
+ return 1;
+ }
+ }
+ else
+ {
+ if(g_CurrentTime <= pdetail_pr->offload_s2c_timestamp_s)
+ {
+ local_sys_stat->count[SAPP_STAT_UDP_OFFLOAD_PKTS]++;
+ local_sys_stat->length[SAPP_STAT_UDP_OFFLOAD_BYTES]+=payload_bytes;
+ return 1;
+ }
+ }
+
+
+ if(pdetail_pr->c2s_smartoffload==0 && pdetail_pr->s2c_smartoffload==0)
+ {
+ local_sys_stat->count[SAPP_STAT_UDP_OFFLOAD_STREAM]++;
+ }
+ else
+ {
+ local_sys_stat->count[SAPP_STAT_UDP_OFFLOAD_PKTS]++;
+ local_sys_stat->length[SAPP_STAT_UDP_OFFLOAD_BYTES]+=payload_bytes;
+ }
+
+ if(pstream->curdir==DIR_C2S)
+ {
+ pdetail_pr->c2s_smartoffload=1;
+ pdetail_pr->offload_c2s_timestamp_s=g_CurrentTime;
+ }
+ else
+ {
+ pdetail_pr->s2c_smartoffload=1;
+ pdetail_pr->offload_s2c_timestamp_s=g_CurrentTime;
+ }
+
+ MESA_send_smart_offload(pstream, (const void *)raw_pkt, pstream->threadnum);
+
+ return 1;
+}
+
+
static void udp_change_stream_state(struct streamindex *pindex, struct mesa_udp_hdr *udph, const raw_pkt_t *raw_pkt)
{
int ulen =0;
@@ -37,33 +223,20 @@ static void udp_change_stream_state(struct streamindex *pindex, struct mesa_udp_
ulen = ntohs (udph->uh_ulen);
datalen =ulen - sizeof (struct mesa_udp_hdr);
+ udp_update_pdetail_stat(pdetail, a_udp->curdir, 1, (UINT64)datalen);
+ udp_update_flow_stat(pdetail_pr->flow_stat, a_udp->curdir, 1, (UINT64)datalen, (UINT64)(raw_pkt->raw_pkt_len - raw_pkt->overlay_layer_bytes));
+
if(a_udp->curdir==DIR_C2S)
{
- pdetail->serverpktnum++;
- pdetail->serverbytes+=datalen;
if(a_udp->dir==DIR_S2C){
a_udp->dir=DIR_DOUBLE;
}
- if(G_UDP_FLOW_STAT_PROJECT_ID != -1){
- pdetail_pr->flow_stat->C2S_pkt++;
- pdetail_pr->flow_stat->C2S_byte += datalen;
- pdetail_pr->flow_stat->C2S_all_byte_raw += raw_pkt->raw_pkt_len - raw_pkt->overlay_layer_bytes;
- }
}
else
{
- pdetail->clientpktnum++;
- pdetail->clientbytes+=datalen;
if(a_udp->dir==DIR_C2S){
a_udp->dir=DIR_DOUBLE;
- }
-
- if(G_UDP_FLOW_STAT_PROJECT_ID != -1){
- pdetail_pr->flow_stat->S2C_pkt++;
- pdetail_pr->flow_stat->S2C_byte += datalen;
- pdetail_pr->flow_stat->S2C_all_byte_raw += raw_pkt->raw_pkt_len - raw_pkt->overlay_layer_bytes;
- }
-
+ }
}
pdetail->datalen=datalen;
pdetail->pdata=(char *)udph + sizeof (struct mesa_udp_hdr);
@@ -486,7 +659,6 @@ int dealipv4udppkt(struct streamindex *pindex, const struct mesa_ip4_hdr * this_
int hlen=0;
int ret=PASS;
sapp_gval_mthread_sys_stat_t *local_sys_stat = &sapp_global_val->mthread_volatile[thread_num]->sys_stat;
- int try_to_update_addr_info = 0;
int is_overlay_udp_layer = 0;
iplen = ntohs (this_iphdr->ip_len);
@@ -604,6 +776,29 @@ int dealipv4udppkt(struct streamindex *pindex, const struct mesa_ip4_hdr * this_
pstream->pudpdetail->lastmtime=(long)g_CurrentTime;
pstream_pr->stream_lastupdate_timestamp_ms=sapp_global_val->individual_volatile->current_time_ms;
+ if(raw_pkt->is_offload_report)
+ {
+ if(ulen-sizeof(struct mesa_udp_hdr)!=sizeof(struct smartoffload_report))
+ {
+ sapp_runtime_log(RLOG_LV_FATAL,
+ "UDP stream offload report addr: %s, but sizeof(struct smartoffload_report)=%d, udp payload len=%d , return PASS.",
+ printaddr(&pstream->addr, pstream->threadnum),
+ sizeof(struct smartoffload_report),
+ ulen-sizeof(struct mesa_udp_hdr)
+ );
+ return PASS;
+ }
+
+ udp_update_smartoffload_report(pstream, raw_pkt, ((char *)udph)+sizeof(struct mesa_udp_hdr), ulen-sizeof(struct mesa_udp_hdr));
+ if(is_recv_all_udp_smartoffload_report(pstream_pr))
+ {
+ pstream->opstate=OP_STATE_CLOSE;
+ stream_process_udp(pstream, NULL, NULL, NULL ,&(pdetail_pr->apme), &(pstream->opstate));
+ udp_cleardata(pstream);
+ }
+ return PASS;
+ }
+
if(pstream_pr->under_ddos_bypass){
local_sys_stat->count[SAPP_STAT_UDP_BYPASS_PKTS]++;
local_sys_stat->length[SAPP_STAT_UDP_BYPASS_BYTES]+= ulen;
@@ -625,17 +820,8 @@ int dealipv4udppkt(struct streamindex *pindex, const struct mesa_ip4_hdr * this_
if(unlikely(pdetail_pr->drop_stream_flag != 0)){ /* 2020-06-02 lijia add */
return DROP;
}
-
- if(pstream->curdir==DIR_S2C){
- if(pdetail_pr->udpdetail_public.clientpktnum == 0){ /* ��ǰ����ĵ�һ����, ���Ը��µײ������ĵ����ַ��Ϣ(��MPLS, GTP) */
- try_to_update_addr_info = 1;
- }
- }else{
- if(pdetail_pr->udpdetail_public.serverpktnum == 0){ /* ��ǰ����ĵ�һ����, ���Ը��µײ������ĵ����ַ��Ϣ(��MPLS, GTP) */
- try_to_update_addr_info = 1;
- }
- }
- if(try_to_update_addr_info == 1){
+
+ if(is_opposite_udp_addr(pdetail_pr->udpdetail_public.clientpktnum, pdetail_pr->udpdetail_public.serverpktnum, pstream->curdir)){
update_opposite_addr_info(pstream_pr, (struct streaminfo_private *)(pstream_pr->pfather_pr),
(struct streaminfo_private *)(pindex->stream.pfather_pr), pstream->curdir);
}
@@ -665,33 +851,23 @@ int dealipv4udppkt(struct streamindex *pindex, const struct mesa_ip4_hdr * this_
else
{
/* 2022-04-13 liuxueli add, for udp offload stream */
- if(pdetail_pr->offload_stream_flag==SMART_OFFLOAD_FLAG_UDP
- && pstream_pr->stream_carry_up_layer_tunnel_type==STREAM_TUNNLE_NON
- && DROP!=ret
- && (g_CurrentTime > pdetail_pr->offload_stream_timestamp_s))
+ if(pstream_pr->stream_carry_up_layer_tunnel_type==STREAM_TUNNLE_NON)
{
- local_sys_stat->count[SAPP_STAT_UDP_OFFLOAD_PKTS]++;
- local_sys_stat->length[SAPP_STAT_UDP_OFFLOAD_BYTES]+= ulen;
- MESA_send_smart_offload(pstream, (const void *)raw_pkt, pstream->threadnum);
- pdetail_pr->offload_stream_timestamp_s = g_CurrentTime;
- return PASS;
+ ret=udp_try_call_smartoffload(pstream, raw_pkt, (UINT32)ulen);
+ if(ret==1)
+ {
+ return PASS;
+ }
}
-
ret=stream_process_udp(pstream,(const void *)this_iphdr, (const void *)udph, raw_pkt,&(pdetail_pr->apme),&(pstream->opstate));
udp_cleardata(pstream);
}
}
- if(pdetail_pr->offload_stream_flag==SMART_OFFLOAD_FLAG_UDP
- && pstream_pr->stream_carry_up_layer_tunnel_type==STREAM_TUNNLE_NON
- && DROP!=ret
- && (g_CurrentTime > pdetail_pr->offload_stream_timestamp_s))
+ if(DROP!=ret && pstream_pr->stream_carry_up_layer_tunnel_type==STREAM_TUNNLE_NON && pstream->opstate!=OP_STATE_CLOSE)
{
- local_sys_stat->count[SAPP_STAT_UDP_OFFLOAD_STREAM]++;
- MESA_send_smart_offload(pstream, (const void *)raw_pkt, pstream->threadnum);
- pdetail_pr->offload_stream_timestamp_s = g_CurrentTime;
- return PASS;
+ udp_try_call_smartoffload(pstream, raw_pkt, 0);
}
#if (COMPAT_PAPP_FOR_BENCHMARK == 0)
@@ -739,7 +915,6 @@ int dealipv6udppkt(struct streamindex *pindex,const struct mesa_ip6_hdr *a_packe
void *tmpme=NULL;
int ret=PASS;
sapp_gval_mthread_sys_stat_t *local_sys_stat = &sapp_global_val->mthread_volatile[thread_num]->sys_stat;
- int try_to_update_addr_info = 0;
sapp_dup_pkt_key_v6_t dup_bloom_key;
int next_layer_offset;
iplen = ntohs (a_packet->ip6_payload_len);
@@ -752,6 +927,8 @@ int dealipv6udppkt(struct streamindex *pindex,const struct mesa_ip6_hdr *a_packe
return PASS;
}
+ int datalen =ulen - sizeof (struct mesa_udp_hdr);
+
local_sys_stat->count[SAPP_STAT_RCV_UDP]++;
local_sys_stat->length[SAPP_STAT_RCV_UDP]+=ulen;
if (routedir == sapp_global_val->config.packet_io.inbound_route_dir)
@@ -837,6 +1014,29 @@ int dealipv6udppkt(struct streamindex *pindex,const struct mesa_ip6_hdr *a_packe
pstream->pudpdetail->lastmtime=(long)g_CurrentTime;
pstream_pr->stream_lastupdate_timestamp_ms=sapp_global_val->individual_volatile->current_time_ms;
+ if(raw_pkt->is_offload_report)
+ {
+ if(ulen-sizeof(struct mesa_udp_hdr)!=sizeof(struct smartoffload_report))
+ {
+ sapp_runtime_log(RLOG_LV_FATAL,
+ "UDP stream offload report addr: %s, but sizeof(struct smartoffload_report)=%d, udp payload len=%d , return PASS.",
+ printaddr(&pstream->addr, pstream->threadnum),
+ sizeof(struct smartoffload_report),
+ ulen-sizeof(struct mesa_udp_hdr)
+ );
+ return PASS;
+ }
+
+ udp_update_smartoffload_report(pstream, raw_pkt, ((char *)udph)+sizeof(struct mesa_udp_hdr), ulen-sizeof(struct mesa_udp_hdr));
+ if(is_recv_all_udp_smartoffload_report(pstream_pr))
+ {
+ pstream->opstate=OP_STATE_CLOSE;
+ stream_process_udp(pstream, NULL, NULL, NULL ,&(pdetail_pr->apme), &(pstream->opstate));
+ udp_cleardata(pstream);
+ }
+ return PASS;
+ }
+
if(pstream_pr->under_ddos_bypass){
local_sys_stat->count[SAPP_STAT_UDP_BYPASS_PKTS]++;
local_sys_stat->length[SAPP_STAT_UDP_BYPASS_BYTES]+= ulen;
@@ -870,16 +1070,7 @@ int dealipv6udppkt(struct streamindex *pindex,const struct mesa_ip6_hdr *a_packe
return DROP;
}
- if(pstream->curdir==DIR_S2C){
- if(pdetail_pr->udpdetail_public.clientpktnum == 0){ /* ��ǰ����ĵ�һ����, ���Ը��µײ������ĵ����ַ��Ϣ(��MPLS, GTP) */
- try_to_update_addr_info = 1;
- }
- }else{
- if(pdetail_pr->udpdetail_public.serverpktnum == 0){ /* ��ǰ����ĵ�һ����, ���Ը��µײ������ĵ����ַ��Ϣ(��MPLS, GTP) */
- try_to_update_addr_info = 1;
- }
- }
- if(try_to_update_addr_info == 1){
+ if(is_opposite_udp_addr(pdetail_pr->udpdetail_public.clientpktnum, pdetail_pr->udpdetail_public.serverpktnum, pstream->curdir)){
update_opposite_addr_info(pstream_pr, (struct streaminfo_private *)(pstream_pr->pfather_pr),
(struct streaminfo_private *)(pindex->stream.pfather_pr), pstream->curdir);
}
@@ -897,17 +1088,14 @@ int dealipv6udppkt(struct streamindex *pindex,const struct mesa_ip6_hdr *a_packe
pstream_pr->offset_to_raw_pkt_hdr = offset_to_raw_pkt_hdr;
#endif
- /* 2022-04-13 liuxueli add, for udp offload stream */
- if(pdetail_pr->offload_stream_flag==SMART_OFFLOAD_FLAG_UDP
- && pstream_pr->stream_carry_up_layer_tunnel_type==STREAM_TUNNLE_NON
- && DROP!=ret
- && (g_CurrentTime > pdetail_pr->offload_stream_timestamp_s))
+ /* 2022-04-13 liuxueli add, for udp offload stream */
+ if(pstream_pr->stream_carry_up_layer_tunnel_type==STREAM_TUNNLE_NON)
{
- local_sys_stat->count[SAPP_STAT_UDP_OFFLOAD_PKTS]++;
- local_sys_stat->length[SAPP_STAT_UDP_OFFLOAD_BYTES]+= ulen;
- MESA_send_smart_offload(pstream, (const void *)raw_pkt, pstream->threadnum);
- pdetail_pr->offload_stream_timestamp_s = g_CurrentTime;
- return PASS;
+ ret=udp_try_call_smartoffload(pstream, raw_pkt, (UINT32)ulen);
+ if(ret==1)
+ {
+ return PASS;
+ }
}
pstream_pr->offset_to_ip_hdr = (char *)udph - (char *)a_packet;
@@ -917,17 +1105,12 @@ int dealipv6udppkt(struct streamindex *pindex,const struct mesa_ip6_hdr *a_packe
udp_cleardata(pstream);
}
- if(pdetail_pr->offload_stream_flag==SMART_OFFLOAD_FLAG_UDP
- && pstream_pr->stream_carry_up_layer_tunnel_type==STREAM_TUNNLE_NON
- && DROP!=ret
- && (g_CurrentTime > pdetail_pr->offload_stream_timestamp_s))
+ if(ret!=DROP && pstream_pr->stream_carry_up_layer_tunnel_type==STREAM_TUNNLE_NON && pstream->opstate!=OP_STATE_CLOSE)
{
- local_sys_stat->count[SAPP_STAT_UDP_OFFLOAD_STREAM]++;
- MESA_send_smart_offload(pstream, (const void *)raw_pkt, pstream->threadnum);
- pdetail_pr->offload_stream_timestamp_s = g_CurrentTime;
- return PASS;
+ udp_try_call_smartoffload(pstream, raw_pkt, 0);
}
+
if(pstream_pr->stream_carry_up_layer_tunnel_type & STREAM_TUNNLE_L2TP){
ret = l2tpv2_entry(pstream_pr, udph, thread_num, routedir, raw_pkt, next_layer_offset);
if(DROP == ret){
diff --git a/src/inner_plug/sapp_assistant.cpp b/src/inner_plug/sapp_assistant.cpp
index b6e2785..6b5bc2c 100644
--- a/src/inner_plug/sapp_assistant.cpp
+++ b/src/inner_plug/sapp_assistant.cpp
@@ -710,6 +710,66 @@ int sapp_get_platform_opt(enum sapp_platform_opt opt, void *opt_val, int *opt_va
strncpy((char *)opt_val, sapp_global_val->config.data_file_path.data_files_root_dir, *opt_val_len);
}
break;
+
+ case SPO_TOTAL_OFFLOAD_STREAM:
+ {
+ if(*opt_val_len != sizeof(long long)){
+ ret = -1;
+ sapp_runtime_log(RLOG_LV_INFO, "sapp_get_platform_opt() SPO_TOTAL_OFFLOAD_INBOUND_PKT error:opt_val_len:%d is invalid!\n", *opt_val_len);
+ break;
+ }
+ unsigned long long *offload_stream_cnt= (unsigned long long *)opt_val;
+ *offload_stream_cnt = __get_platform_opt_traffic('c', SAPP_STAT_OFFLOAD_STREAM);
+ }
+ break;
+
+ case SPO_TOTAL_OFFLOAD_INBOUND_PKT:
+ {
+ if(*opt_val_len != sizeof(long long)){
+ ret = -1;
+ sapp_runtime_log(RLOG_LV_INFO, "sapp_get_platform_opt() SPO_TOTAL_OFFLOAD_INBOUND_PKT error:opt_val_len:%d is invalid!\n", *opt_val_len);
+ break;
+ }
+ unsigned long long *offload_inbound_pkt = (unsigned long long *)opt_val;
+ *offload_inbound_pkt = __get_platform_opt_traffic('c', SAPP_STAT_OFFLOAD_INBOUND);
+ }
+ break;
+
+ case SPO_TOTAL_OFFLOAD_INBOUND_BYTE:
+ {
+ if(*opt_val_len != sizeof(long long)){
+ ret = -1;
+ sapp_runtime_log(RLOG_LV_INFO, "sapp_get_platform_opt() SPO_TOTAL_OFFLOAD_INBOUND_BYTE error:opt_val_len:%d is invalid!\n", *opt_val_len);
+ break;
+ }
+ unsigned long long *offload_inbound_byte = (unsigned long long *)opt_val;
+ *offload_inbound_byte = __get_platform_opt_traffic('l', SAPP_STAT_OFFLOAD_INBOUND);
+ }
+ break;
+
+ case SPO_TOTAL_OFFLOAD_OUTBOUND_PKT:
+ {
+ if(*opt_val_len != sizeof(long long)){
+ ret = -1;
+ sapp_runtime_log(RLOG_LV_INFO, "sapp_get_platform_opt() SPO_TOTAL_OFFLOAD_OUTBOUND_PKT error:opt_val_len:%d is invalid!\n", *opt_val_len);
+ break;
+ }
+ unsigned long long *offload_outbound_pkt = (unsigned long long *)opt_val;
+ *offload_outbound_pkt = __get_platform_opt_traffic('c', SAPP_STAT_OFFLOAD_OUTBOUND);
+ }
+ break;
+
+ case SPO_TOTAL_OFFLOAD_OUTBOUND_BYTE:
+ {
+ if(*opt_val_len != sizeof(long long)){
+ ret = -1;
+ sapp_runtime_log(RLOG_LV_INFO, "sapp_get_platform_opt() SPO_TOTAL_OFFLOAD_OUTBOUND_BYTE error:opt_val_len:%d is invalid!\n", *opt_val_len);
+ break;
+ }
+ unsigned long long *offload_outbound_byte = (unsigned long long *)opt_val;
+ *offload_outbound_byte = __get_platform_opt_traffic('l', SAPP_STAT_OFFLOAD_OUTBOUND);
+ }
+ break;
default:
diff --git a/src/packet_io/packet_io_marsio.c b/src/packet_io/packet_io_marsio.c
index 045ea98..497b6fe 100644
--- a/src/packet_io/packet_io_marsio.c
+++ b/src/packet_io/packet_io_marsio.c
@@ -101,6 +101,7 @@ int (*ptr_marsio_buff_get_metadata)(marsio_buff_t *m, enum mr_buff_metadata_type
int (*ptr_marsio_buff_set_metadata)(marsio_buff_t *m, enum mr_buff_metadata_type type, void *data, unsigned int sz_data);
int (*ptr_marsio_buff_unset_metadata)(marsio_buff_t *m, enum mr_buff_metadata_type type);
marsio_buff_t *(*ptr_marsio_buff_malloc_smartoffload)(struct mr_vdev *vdev, const char * pkt, unsigned int pkt_len);
+int (*ptr_marsio_buff_is_ctrlbuf)(marsio_buff_t * m);
@@ -630,6 +631,9 @@ static inline int marsio4_pkt_hand(int tid, marsio_buff_t *rx_buff, raw_pkt_t *r
raw_pkt->__lib_raw_pkt_len = ptr_marsio_buff_datalen(rx_buff);
raw_pkt->raw_pkt_len = raw_pkt->__lib_raw_pkt_len;
raw_pkt->io_lib_pkt_reference = rx_buff;
+
+ raw_pkt->is_offload_report=ptr_marsio_buff_is_ctrlbuf(rx_buff);
+
/* ˫��ģʽdir��������internal, external����,
inlineģʽ��ʱ��dir������, ���ջ��� packet_io_hook_input_vxlan() ,ͨ��vxlan header����routedir .
*/
@@ -1060,6 +1064,12 @@ static int marsio_dl_get_function_entry(void)
sleep(1);
}
+ ptr_marsio_buff_is_ctrlbuf = (int (*)(marsio_buff_t * m))dlsym(marsio_so_handle, "marsio_buff_is_ctrlbuf");
+ if(NULL == ptr_marsio_buff_is_ctrlbuf){
+ printf("\033[33m[Error]dlsym function '%s' from '%s' failed!\033[0m\n", "marsio_buff_is_ctrlbuf", ABBR_MARSIO_LIBRARY_FILE);
+ sleep(1);
+ }
+
/* for vlan flipping */
if(DEPOLYMENT_MODE_INLINE == sapp_global_val->config.packet_io.depolyment_mode_bin){
ptr_marsio_buff_get_metadata = (int (*)(marsio_buff_t *m, enum mr_buff_metadata_type type, void *data, unsigned int sz_data))dlsym(marsio_so_handle, "marsio_buff_get_metadata");
diff --git a/src/packet_io/sendpacket.c b/src/packet_io/sendpacket.c
index 4237441..81402d9 100644
--- a/src/packet_io/sendpacket.c
+++ b/src/packet_io/sendpacket.c
@@ -4931,24 +4931,6 @@ int MESA_send_smart_offload(const struct streaminfo *pstream, const void *raw_pk
return -1;
}
- switch(pstream->type)
- {
- case STREAM_TYPE_TCP:
- if(sapp_global_val->config.stream.tcp.meaningful_statistics_minimum_pkt>=(pstream->ptcpdetail->serverpktnum+pstream->ptcpdetail->clientpktnum))
- {
- return 0;
- }
- break;
- case STREAM_TYPE_UDP:
- if(sapp_global_val->config.stream.udp.meaningful_statistics_minimum_pkt>=(pstream->pudpdetail->serverpktnum+pstream->pudpdetail->clientpktnum))
- {
- return 0;
- }
- break;
- default:
- return -1;
- }
-
const raw_pkt_t *_raw_pkt=(raw_pkt_t *)raw_pkt;
MESA_send_handle *send_handle = packet_io_get_send_handle(thread_num);