diff --git a/src/gquic_process.c b/src/gquic_process.c index 91ca9e1..74ce322 100644 --- a/src/gquic_process.c +++ b/src/gquic_process.c @@ -282,8 +282,9 @@ static enum _QUIC_VERSION parse_q0to43_header(struct streaminfo *pstream, struct _context->is_quic=TRUE; } - if(_context->is_quic==FALSE) + if(_context->is_quic==FALSE || gquic_hdr->quic_versionquic_version>GQUIC_VERSION_Q043) { + _context->is_quic=FALSE; return QUIC_VERSION_UNKNOWN; } @@ -457,9 +458,12 @@ enum _QUIC_VERSION is_quic_protocol(struct streaminfo *pstream, struct _quic_con MESA_handle_runtime_log(g_quic_param.logger, RLOG_LV_DEBUG, "QUIC_UNSUPPORT", "version: Q%03u addr: %s", (((quic_version>>8)&0x0000000F)*10) + ((quic_version)&0x0000000F), printaddr(&pstream->addr, pstream->threadnum)); + + _context->is_quic=TRUE; + _context->quic_info.quic_hdr.quic_version=quic_version; + return quic_version; break; default: - break; } @@ -863,8 +867,9 @@ int quic_process(struct streaminfo *pstream, struct _quic_context* _context, int is_gquic=is_quic_protocol(pstream, _context, (char *)udp_detail->pdata, udp_detail->datalen, &used_len); if(is_gquic!=QUIC_VERSION_UNKNOWN) { - if(_context->quic_info.quic_hdr.packet_number==1 && _context->call_business) + if(_context->cb_version==0 && _context->call_business) { + _context->cb_version=1; ret=quic_callPlugins(pstream, _context, &(_context->quic_info.quic_hdr.quic_version), sizeof(_context->quic_info.quic_hdr.quic_version), QUIC_USEING_VERSION_MASK, a_packet); if(ret&APP_STATE_DROPME | ret&APP_STATE_DROPPKT) { @@ -911,7 +916,7 @@ int quic_process(struct streaminfo *pstream, struct _quic_context* _context, int int quic_protocol_identify(struct streaminfo *a_stream, void *a_packet, char *out_sni, int out_sni_len) { int ret=APP_STATE_GIVEME; - int sni_len=0,len=0; + int sni_len=0,len=-1; void *pme=NULL; char *sni=NULL; struct _quic_context *_context=NULL; @@ -929,6 +934,13 @@ int quic_protocol_identify(struct streaminfo *a_stream, void *a_packet, char *ou len= sni_len>(out_sni_len-1) ? (out_sni_len-1) : sni_len; memcpy(out_sni, sni, len); } + else + { + if(_context->is_quic==TRUE) + { + len=0; + } + } } quic_release_stream(&pme, a_stream->threadnum); diff --git a/src/gquic_process.h b/src/gquic_process.h index 5926f78..67d355c 100644 --- a/src/gquic_process.h +++ b/src/gquic_process.h @@ -269,6 +269,7 @@ enum _QUIC_VERSION struct _quic_context { int is_quic; + int cb_version; int link_state; int call_business; void *business_pme; diff --git a/src/quic_analysis.h b/src/quic_analysis.h index 639006b..71c8c67 100644 --- a/src/quic_analysis.h +++ b/src/quic_analysis.h @@ -5,6 +5,7 @@ #define FALSE 0x00 #define TRUE 0x01 +#define MAYBE 0x02 #define QUIC_HALF_CLOSE 0x01