diff --git a/inc/gquic.h b/inc/gquic.h index a24f45f..133912c 100644 --- a/inc/gquic.h +++ b/inc/gquic.h @@ -90,7 +90,7 @@ struct _quic_info //buff_len minimun 32bytes int quic_version_int2string(unsigned int version, char *buff, int buff_len); -//ret: 0: not quic, >0: quic -int quic_protocol_identify(struct streaminfo *a_stream, void *a_packet, char *out_sni, int out_sni_len); +//ret: 0: not quic, >0: quic version +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); #endif /* SRC_GQUIC_H_ */ diff --git a/src/gquic_process.cpp b/src/gquic_process.cpp index 3d1183d..da1e810 100644 --- a/src/gquic_process.cpp +++ b/src/gquic_process.cpp @@ -20,6 +20,10 @@ #define PRINTADDR(a, b) ((b)addr), a->threadnum) : "") #endif +#ifndef MIN +#define MIN(a, b) (((a) < (b)) ? (a) : (b)) +#endif + const unsigned char PCAP_FILE_HEAD[24] = {0xD4, 0xC3, 0xB2, 0xA1, 0x02, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00}; @@ -1350,18 +1354,17 @@ int quic_process(struct streaminfo *pstream, struct _quic_context* _context, int return APP_STATE_DROPME;; } - -int quic_protocol_identify(struct streaminfo *a_stream, void *a_packet, char *out_sni, int out_sni_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; - int sni_len=0,len=-1; + int len=0; void *pme=NULL; - char *sni=NULL; struct _quic_context *_context=NULL; + unsigned int quic_version=QUIC_VERSION_UNKNOWN; if(!is_quic_port(a_stream)) { - return len; + return quic_version; } quic_init_stream(&pme, a_stream->threadnum); @@ -1374,26 +1377,30 @@ int quic_protocol_identify(struct streaminfo *a_stream, void *a_packet, char *ou { if(_context->quic_info.client_hello->sni_idx!=0xFF) { - sni=(char *)(_context->quic_info.client_hello->ext_tags[_context->quic_info.client_hello->sni_idx].value); - sni_len=_context->quic_info.client_hello->ext_tags[_context->quic_info.client_hello->sni_idx].length; - len= sni_len>(out_sni_len-1) ? (out_sni_len-1) : sni_len; - memcpy(out_sni, sni, len); + len=MIN((int)_context->quic_info.client_hello->ext_tags[_context->quic_info.client_hello->sni_idx].length, (*out_sni_len)-1); + memcpy(out_sni, _context->quic_info.client_hello->ext_tags[_context->quic_info.client_hello->sni_idx].value, len); + (*out_sni_len)=len; } - else + + if(_context->quic_info.client_hello->ua_idx!=0xFF) { - len=0; + len=MIN((int)_context->quic_info.client_hello->ext_tags[_context->quic_info.client_hello->ua_idx].length, (*out_ua_len)-1); + memcpy(out_ua, _context->quic_info.client_hello->ext_tags[_context->quic_info.client_hello->ua_idx].value, len); + (*out_ua_len)=len; } + + quic_version=_context->quic_info.quic_hdr.quic_version; } else { if(_context->is_quic==TRUE) { - len=0; + quic_version=_context->quic_info.quic_hdr.quic_version; } } } quic_release_stream(&pme, a_stream->threadnum); - return len; + return quic_version; }