From d7109c2539b3b95402b91cc15a9d3a92f63e5485 Mon Sep 17 00:00:00 2001 From: yangwei Date: Tue, 16 Apr 2024 16:35:27 +0800 Subject: ✨ feat(omit gtp stream): omit gtp layer as udp stream MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/dealpkt/deal_gprs_tunnel.c | 19 +------- src/dealpkt/deal_udp.c | 105 ++++++++++++++++++++--------------------- src/dealpkt/stream_manage.c | 2 + 3 files changed, 56 insertions(+), 70 deletions(-) diff --git a/src/dealpkt/deal_gprs_tunnel.c b/src/dealpkt/deal_gprs_tunnel.c index 17b67f5..8520262 100644 --- a/src/dealpkt/deal_gprs_tunnel.c +++ b/src/dealpkt/deal_gprs_tunnel.c @@ -204,7 +204,7 @@ int gtp_entry(struct streaminfo_private *pfstream_pr,void *this_layer_data,int t } //½öʶ±ðGTP-UЭÒ飬ÓÃÓÚ½øÐÐËíµÀ´¦Àí -int identify_gtp(const struct streaminfo *pstream,const char *payload, unsigned int udp_payload_len) +int identify_gtp(const struct streaminfo *pstream,const char *payload, unsigned int udp_payload_len, int is_ctrl_pkt) { if (udp_payload_len >= sizeof(struct gtp_hdr)) { @@ -227,6 +227,7 @@ int identify_gtp(const struct streaminfo *pstream,const char *payload, unsigned unsigned short gtp_version = (gtp->flags & 0xE0) >> 5; if ((gtp_version == 0) || (gtp_version == 1)) { + if(is_ctrl_pkt==1)return 1; unsigned short message_len = ntohs(gtp->len); /* NOTE: gtp->len²»°üÀ¨gtpÍ·²¿¹Ì¶¨³¤¶È(8×Ö½Ú), Ö»°üÀ¨À©Õ¹Í·²¿ºÍ¸ºÔØ */ if (message_len == (udp_payload_len - sizeof(struct gtp_hdr))) { @@ -246,22 +247,6 @@ int identify_gtp(const struct streaminfo *pstream,const char *payload, unsigned return 0; } -/* - ÄÚÖòå¼þ, - ÓÃÓÚʶ±ðµ±Ç°UDPÁ÷ÊÇ·ñÊÇËíµÀ. - Èç¹ûÊÇËíµÀ, ÔÚstreaminfo_private->stream_carry_up_layer_tunnel_typeÖÐÉèÖñê¼Ç. -*/ -char udp_gtp_identify_entry(const struct streaminfo *pstream, const void *this_hdr, const void *raw_pkt, void **pme) -{ - struct streaminfo_private *pstream_pr = (struct streaminfo_private *)pstream; - if(1 == identify_gtp(pstream, (char *)this_hdr+sizeof(struct mesa_udp_hdr), - pstream_pr->raw_pkt->raw_pkt_len - ((const char *)this_hdr - (const char*)pstream_pr->raw_pkt->raw_pkt_data) - sizeof(struct mesa_udp_hdr))) - { - pstream_pr->stream_carry_up_layer_tunnel_type |= STREAM_TUNNEL_GPRS_TUNNEL; - } - return APP_STATE_DROPME; /* ÿ¸öÁ÷Ö»¿´µÚÒ»¸ö°ü, ²»¹ÜÊÇ·ñGTPËíµÀ, ºóÐø¶¼²»ÔÙ´¦ÀíÁË */ -} - #ifdef __cplusplus } diff --git a/src/dealpkt/deal_udp.c b/src/dealpkt/deal_udp.c index 833e7d5..4a07033 100644 --- a/src/dealpkt/deal_udp.c +++ b/src/dealpkt/deal_udp.c @@ -169,7 +169,7 @@ static struct streamindex *udp_add_new_stream(struct streamindex *pindex, pindex_udp->phashprev = NULL; #endif - + pindex_udp->stream.stream_carry_up_layer_tunnel_type=pindex->stream.stream_carry_up_layer_tunnel_type; pindex_udp->stream.dirreverse = 0; pstream_udp_pr = &pindex_udp->stream; @@ -245,18 +245,7 @@ static struct streamindex *udp_add_new_stream(struct streamindex *pindex, project_req_add_struct(pstream_udp, G_UDP_FLOW_STAT_PROJECT_ID, pdetail_pr->flow_stat); } - extern int identify_gtp(const struct streaminfo *pstream, const char *payload, unsigned int udp_payload_len); - if (1 == identify_gtp(pstream_udp, (char *)this_udphdr + sizeof(struct mesa_udp_hdr), - pstream_udp_pr->raw_pkt->raw_pkt_len - - ((const char *)this_udphdr - (const char *)pstream_udp_pr->raw_pkt->raw_pkt_data) - - sizeof(struct mesa_udp_hdr))) - { - pstream_udp_pr->stream_carry_up_layer_tunnel_type |= STREAM_TUNNEL_GPRS_TUNNEL; - } - else - { - save_polling_inject_context(SAPP_MEM_DYN_UDP_POLLING_RAW_PKT, pstream_udp_pr, raw_pkt); - } + save_polling_inject_context(SAPP_MEM_DYN_UDP_POLLING_RAW_PKT, pstream_udp_pr, raw_pkt); if(createdir==DIR_C2S){ pstream_udp_pr->stream_c2s_route_dir = raw_pkt->route_dir; @@ -532,6 +521,9 @@ static int dealipv4udppkt_dup_check(int tid, struct streaminfo_private *pstream_ return is_dup_pkt; } +extern int identify_gtp(const struct streaminfo *pstream, const char *payload, + unsigned int udp_payload_len, int is_ctrl_pkt); + int dealipv4udppkt(struct streamindex *pindex, const struct mesa_ip4_hdr * this_iphdr, int thread_num,unsigned char routedir, const raw_pkt_t *raw_pkt, int offset_to_raw_pkt_hdr) { @@ -604,17 +596,23 @@ int dealipv4udppkt(struct streamindex *pindex, const struct mesa_ip4_hdr * this_ local_sys_stat->length[SAPP_STAT_UDP_OUTBOUND] += datalen; } } - - //add by lqy 20130530 + + set_transport_addr(pstream, 1, udph->uh_sport, udph->uh_dport); + if (identify_gtp(pstream, (char *)udph + sizeof(struct mesa_udp_hdr), + pstream_pr->raw_pkt->raw_pkt_len - + ((const char *)udph - (const char *)pstream_pr->raw_pkt->raw_pkt_data) - + sizeof(struct mesa_udp_hdr),raw_pkt->is_ctrl_pkt)) + { + pstream_pr->stream_carry_up_layer_tunnel_type |= STREAM_TUNNEL_GPRS_TUNNEL; + return gtp_entry(stack_stream_pr, udph, thread_num, routedir, raw_pkt, next_layer_offset); + } + //add by lqy 20130530 // udpÓв»¿ªÆôÁ÷»¹Ô­µÄ¹¦ÄÜÐèÇó£¬Ö±½Ó°´µ¥°üµ¥Á÷´¦Àí if(unlikely(0 ==udp_stream_table_size)) { struct udpdetail_private detail_pr; memset(&detail_pr, 0, sizeof(struct udpdetail_private)); pdetail = (struct udpdetail *)&detail_pr; - - set_transport_addr(pstream, 1, udph->uh_sport, udph->uh_dport); - pstream_pr->offset_to_ip_hdr = (char *)udph - (char *)this_iphdr; /* µ¥°ü¼¶, ¼Ù¶¨Ô´¶Ë¿Ú´óµÄΪClient */ @@ -659,38 +657,38 @@ int dealipv4udppkt(struct streamindex *pindex, const struct mesa_ip4_hdr * this_ } else { - set_transport_addr(pstream, 1, udph->uh_sport, udph->uh_dport); + a_index =(struct streamindex * ) findstreamindex (pindex, raw_pkt); - if (unlikely(!a_index)){ - //a_index = udp_add_new_stream (ptmp, udph); - if(sapp_global_val->config.packet_io.dup_pkt_para.kickout_udp_stream_enabled) + if (unlikely(!a_index)) + { + if (sapp_global_val->config.packet_io.dup_pkt_para.kickout_udp_stream_enabled) { if (sapp_dup_stream_search(pstream) == 1) { - local_sys_stat->count[SAPP_STAT_UDP_DUP_KICK_STREAM]++; + local_sys_stat->count[SAPP_STAT_UDP_DUP_KICK_STREAM]++; return PASS; } } - if(raw_pkt->is_ctrl_pkt==0) - { - a_index = udp_add_new_stream(pindex, udph, raw_pkt); - } - else - { - return PASS; - } + if (raw_pkt->is_ctrl_pkt == 0) + { + a_index = udp_add_new_stream(pindex, udph, raw_pkt); + } + else // ctrl packet never trigger new stream + { + return PASS; + } + } + // add by lqy Ö»Óе±Á´½ÓÎ´ÖØÖÃʱ½øÐÐlru + else + { + if (lrustream(a_index) == 1) + { + udp_reset_stream(a_index); + } } - //add by lqy Ö»Óе±Á´½ÓÎ´ÖØÖÃʱ½øÐÐlru - else - { - if(lrustream(a_index)==1) - { - udp_reset_stream(a_index); - } - } - /* NOTE: ¸üÐÂpstreamÖ¸Õë, Ö¸Ïò¶ÑÖд洢µÄÄÚ´æ */ + /* NOTE: ¸üÐÂpstreamÖ¸Õë, Ö¸Ïò¶ÑÖд洢µÄÄÚ´æ */ pstream_pr=&(a_index->stream); pstream=&(pstream_pr->stream_public); //pstream->addr.pktipfragtype = pstream->stream_public.addr.pktipfragtype; /* 2015-11-04 lijia add, IP·ÖƬÀàÐ͸üР*/ @@ -826,9 +824,6 @@ int dealipv4udppkt(struct streamindex *pindex, const struct mesa_ip4_hdr * this_ } } - if(pstream_pr->stream_carry_up_layer_tunnel_type & STREAM_TUNNEL_GPRS_TUNNEL){ - ret = gtp_entry(stack_stream_pr, udph, thread_num, routedir, raw_pkt, next_layer_offset); - } pstream_pr->packet_process_context=0; if(DROP == ret){ sapp_runtime_log(RLOG_LV_DEBUG, "UDP stream: %s, curdir:%d, return DROP.", printaddr(&pstream->addr, pstream->threadnum), pstream->curdir); @@ -891,11 +886,20 @@ int dealipv6udppkt(struct streamindex *pindex,const struct mesa_ip6_hdr *a_packe pstream->threadnum=thread_num; next_layer_offset = offset_to_raw_pkt_hdr + sizeof(struct mesa_udp_hdr); - //add by lqy 20130530 + set_transport_addr(pstream, 1, udph->uh_sport, udph->uh_dport); + if (identify_gtp(pstream, (char *)udph + sizeof(struct mesa_udp_hdr), + pstream_pr->raw_pkt->raw_pkt_len - + ((const char *)udph - (const char *)pstream_pr->raw_pkt->raw_pkt_data) - + sizeof(struct mesa_udp_hdr), raw_pkt->is_ctrl_pkt)) + { + pstream_pr->stream_carry_up_layer_tunnel_type |= STREAM_TUNNEL_GPRS_TUNNEL; + return gtp_entry(pstream_pr, udph, thread_num, routedir, raw_pkt, next_layer_offset); + } + //add by lqy 20130530 // udpÓв»¿ªÆôÁ÷»¹Ô­µÄ¹¦ÄÜÐèÇó£¬Ö±½Ó°´µ¥°üµ¥Á÷´¦Àí - - if(unlikely(0 == udp_stream_table_size)) + if(unlikely(0 == udp_stream_table_size)) { + /* µ¥°ü¼¶, ¼Ù¶¨Ô´¶Ë¿Ú´óµÄΪClient */ if(memcmp(&udph->uh_sport, &udph->uh_dport, sizeof(short)) >= 0){ pstream->curdir=DIR_C2S; @@ -928,8 +932,6 @@ int dealipv6udppkt(struct streamindex *pindex,const struct mesa_ip6_hdr *a_packe } else { - set_transport_addr(pstream, 1, udph->uh_sport, udph->uh_dport); - a_index =(struct streamindex *)findstreamindex (pindex, raw_pkt); if(unlikely(!a_index)) { @@ -943,7 +945,7 @@ int dealipv6udppkt(struct streamindex *pindex,const struct mesa_ip6_hdr *a_packe } if(raw_pkt->is_ctrl_pkt==0) { - a_index = udp_add_new_stream(pindex, udph, raw_pkt); + a_index = udp_add_new_stream(pindex, udph, raw_pkt); } else { @@ -1083,10 +1085,7 @@ int dealipv6udppkt(struct streamindex *pindex,const struct mesa_ip6_hdr *a_packe } } - if(pstream_pr->stream_carry_up_layer_tunnel_type & STREAM_TUNNEL_GPRS_TUNNEL){ - ret = gtp_entry(pstream_pr, udph, thread_num, routedir, raw_pkt, next_layer_offset); - //ret = gtp_entry(&pindex->stream, udph, thread_num, routedir, raw_pkt, next_layer_offset); - } + /* TODO 2, »ùÓÚIPv6µÄUDP port 1701 L2TPЭÒé */ pstream_pr->packet_process_context=0; diff --git a/src/dealpkt/stream_manage.c b/src/dealpkt/stream_manage.c index fa91548..977c4ba 100644 --- a/src/dealpkt/stream_manage.c +++ b/src/dealpkt/stream_manage.c @@ -1305,6 +1305,8 @@ int checkstreamorder(const struct streaminfo_private *top_stream_pr, struct stre } ret = cmpaddr_new(pheap_stream_pr, pstack_stream_pr); + + if(0 != ret){ return ret; }else{ -- cgit v1.2.3