summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryangwei <[email protected]>2024-04-16 16:35:27 +0800
committeryangwei <[email protected]>2024-04-16 18:11:26 +0800
commitd7109c2539b3b95402b91cc15a9d3a92f63e5485 (patch)
treeb17610cb11aa23465efd7255b52e2daa0f990921
parent6c1e6a601220a9281744f5ed626d7468b2871b8f (diff)
✨ feat(omit gtp stream): omit gtp layer as udp streamFeature-omit0-tunnel-outer-stream
-rw-r--r--src/dealpkt/deal_gprs_tunnel.c19
-rw-r--r--src/dealpkt/deal_udp.c105
-rw-r--r--src/dealpkt/stream_manage.c2
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{