summaryrefslogtreecommitdiff
path: root/src/quic_process.cpp
diff options
context:
space:
mode:
authorliuxueli <[email protected]>2021-11-10 19:39:17 +0300
committerliuxueli <[email protected]>2021-11-10 19:39:17 +0300
commit895e4c08bb169a35bfa9d7a639c7a68a396e9d52 (patch)
treeab15c934a1531e91c62a171a6fa9de55849759ee /src/quic_process.cpp
parent11c3aa538a3d7e73e1f1f29269ffdf2900d20803 (diff)
TSG-8364: 支持配置文件配置最多解析N数据包
Diffstat (limited to 'src/quic_process.cpp')
-rw-r--r--src/quic_process.cpp70
1 files changed, 55 insertions, 15 deletions
diff --git a/src/quic_process.cpp b/src/quic_process.cpp
index 97793ae..3284ab2 100644
--- a/src/quic_process.cpp
+++ b/src/quic_process.cpp
@@ -18,9 +18,14 @@
#include "quic_process.h"
#include "quic_deprotection.h"
-#define PARSE_RESULT_UNKNOWN 0
-#define PARSE_RESULT_VERSION 1
-#define PARSE_RESULT_CLIENT_HELLO 2
+enum PARSE_RESULT
+{
+ PARSE_RESULT_UNKNOWN,
+ PARSE_RESULT_VERSION,
+ PARSE_RESULT_CLIENT_HELLO,
+ PARSE_RESULT_PAYLOAD,
+ PARSE_RESULT_MAX
+};
#ifndef PRINTADDR
#define PRINTADDR(a, b) ((b)<RLOG_LV_FATAL ? printaddr(&(a->addr), a->threadnum) : "")
@@ -748,7 +753,7 @@ enum QUIC_VERSION is_quic_protocol(const char *payload, int payload_len, int *pa
return quic_version;
}
-int parse_quic_all_version(struct quic_info *quic_info, const char *payload, int payload_len, int thread_seq)
+unsigned char parse_quic_all_version(struct quic_info *quic_info, const char *payload, int payload_len, int thread_seq)
{
int ret=0, payload_offset=0;
unsigned char decrypt_payload[2048]={0};
@@ -803,24 +808,59 @@ int parse_quic_all_version(struct quic_info *quic_info, const char *payload, int
unsigned char quic_analyze_entry(struct streaminfo *pstream, struct quic_context* context, int thread_seq, void* a_packet)
{
- int ret=PARSE_RESULT_UNKNOWN;
+ unsigned char parse_result=PARSE_RESULT_UNKNOWN;
+ char state=APP_STATE_GIVEME;
+
if(pstream==NULL || pstream->pudpdetail==NULL)
{
return APP_STATE_DROPME;
}
+
struct udpdetail *udp_detail=pstream->pudpdetail;
- ret=parse_quic_all_version(&(context->quic_info), (const char *)udp_detail->pdata, udp_detail->datalen, thread_seq);
- switch(ret)
+
+ switch(context->pre_parse_state)
{
- case PARSE_RESULT_VERSION:
- return quic_call_business_plug(pstream, context, (void *)&(context->quic_info.quic_version), sizeof(unsigned int), QUIC_USEING_VERSION_MASK, a_packet);
- case PARSE_RESULT_CLIENT_HELLO:
- return quic_call_business_plug(pstream, context, (void *)&(context->quic_info), sizeof(void *), QUIC_CLIENT_HELLO_MASK, a_packet);
+ case PARSE_RESULT_CLIENT_HELLO:
+ parse_result=PARSE_RESULT_PAYLOAD;
+ break;
+ case PARSE_RESULT_VERSION:
+ parse_result=parse_quic_all_version(&(context->quic_info), (const char *)udp_detail->pdata, udp_detail->datalen, thread_seq);
+ if(parse_result==PARSE_RESULT_VERSION || parse_result==PARSE_RESULT_UNKNOWN)
+ {
+ parse_result=PARSE_RESULT_PAYLOAD;
+ }
+ break;
+ case PARSE_RESULT_PAYLOAD:
+ case PARSE_RESULT_UNKNOWN:
default:
+ if((context->parse_pkt_cnt++)>=g_quic_param.max_parse_pkt_num)
+ {
+ parse_result=PARSE_RESULT_PAYLOAD;
+ break;
+ }
+ parse_result=parse_quic_all_version(&(context->quic_info), (const char *)udp_detail->pdata, udp_detail->datalen, thread_seq);
+ break;
+ }
+
+ switch(parse_result)
+ {
+ case PARSE_RESULT_VERSION:
+ context->pre_parse_state=PARSE_RESULT_VERSION;
+ state=quic_call_business_plug(pstream, context, (void *)&(context->quic_info.quic_version), sizeof(unsigned int), QUIC_USEING_VERSION_MASK, a_packet);
+ break;
+ case PARSE_RESULT_CLIENT_HELLO:
+ context->pre_parse_state=PARSE_RESULT_CLIENT_HELLO;
+ state=quic_call_business_plug(pstream, context, (void *)&(context->quic_info), sizeof(void *), QUIC_CLIENT_HELLO_MASK, a_packet);
+ break;
+ case PARSE_RESULT_PAYLOAD:
+ state=quic_call_business_plug(pstream, context, udp_detail->pdata, udp_detail->datalen, QUIC_APPLICATION_DATA_MASK, a_packet);
+ break;
+ default:
+ return APP_STATE_DROPME;
break;
}
- return APP_STATE_DROPME;
+ return state;
}
static int copy_client_hello_extension(char *src, char *dest, int d_len)
@@ -839,7 +879,7 @@ static int copy_client_hello_extension(char *src, char *dest, int d_len)
unsigned int quic_protocol_identify(struct streaminfo *a_stream, void *a_packet, char *out_sni, int *out_sni_len, char *out_ua, int *out_ua_len)
{
- int ret=APP_STATE_GIVEME;
+ unsigned char parse_result=APP_STATE_GIVEME;
struct quic_info quic_info={0, NULL};
unsigned int quic_version=QUIC_VERSION_UNKNOWN;
@@ -848,8 +888,8 @@ unsigned int quic_protocol_identify(struct streaminfo *a_stream, void *a_packet,
return quic_version;
}
- ret=parse_quic_all_version(&quic_info, (const char *)a_stream->pudpdetail->pdata, a_stream->pudpdetail->datalen, a_stream->threadnum);
- if(ret!=PARSE_RESULT_UNKNOWN)
+ parse_result=parse_quic_all_version(&quic_info, (const char *)a_stream->pudpdetail->pdata, a_stream->pudpdetail->datalen, a_stream->threadnum);
+ if(parse_result!=PARSE_RESULT_UNKNOWN)
{
if(quic_info.client_hello!=NULL)
{