diff options
| author | yangwei <[email protected]> | 2024-04-16 16:35:27 +0800 |
|---|---|---|
| committer | yangwei <[email protected]> | 2024-04-16 18:11:26 +0800 |
| commit | d7109c2539b3b95402b91cc15a9d3a92f63e5485 (patch) | |
| tree | b17610cb11aa23465efd7255b52e2daa0f990921 | |
| parent | 6c1e6a601220a9281744f5ed626d7468b2871b8f (diff) | |
✨ feat(omit gtp stream): omit gtp layer as udp streamFeature-omit0-tunnel-outer-stream
| -rw-r--r-- | src/dealpkt/deal_gprs_tunnel.c | 19 | ||||
| -rw-r--r-- | src/dealpkt/deal_udp.c | 105 | ||||
| -rw-r--r-- | 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{ |
