diff options
| author | liuxueli <[email protected]> | 2022-12-08 18:01:52 +0800 |
|---|---|---|
| committer | liuxueli <[email protected]> | 2022-12-08 18:01:52 +0800 |
| commit | a5c73fc33664eb542b14fc2dff58b8b067d2ca96 (patch) | |
| tree | 33b12dad53051665a967f9922fa9ad0fbb92361a | |
| parent | 8c77537c819ac4d99fbe92d546047251cc891b7e (diff) | |
TSG-12533: 处理SmartOffload上报统计会话信息计数feature-TSG-12533-deal-offload-report
| -rw-r--r-- | include/private/sapp_pkt_stat.h | 3 | ||||
| -rw-r--r-- | include/private/stream_internal.h | 25 | ||||
| -rw-r--r-- | include/public/stream_inc/stream_control.h | 5 | ||||
| -rw-r--r-- | module_test/include/fake_marsio.h | 12 | ||||
| -rw-r--r-- | module_test/src/gtest_fake_marsio_env.cpp | 213 | ||||
| -rw-r--r-- | module_test/src/gtest_fake_marsio_plug.cpp | 145 | ||||
| -rw-r--r-- | module_test/src/gtest_fake_marsio_run.cpp | 57 | ||||
| -rw-r--r-- | module_test/src/gtest_main.cpp | 15 | ||||
| -rw-r--r-- | module_test/src/gtest_sapp_fun.h | 4 | ||||
| -rw-r--r-- | module_test/src/gtest_sapp_tcp_plug.cpp | 2 | ||||
| -rw-r--r-- | src/dealpkt/deal_tcp.c | 305 | ||||
| -rw-r--r-- | src/dealpkt/deal_udp.c | 335 | ||||
| -rw-r--r-- | src/inner_plug/sapp_assistant.cpp | 60 | ||||
| -rw-r--r-- | src/packet_io/packet_io_marsio.c | 10 | ||||
| -rw-r--r-- | src/packet_io/sendpacket.c | 18 |
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); |
