summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorliuxueli <[email protected]>2021-09-14 09:29:45 +0800
committerliuxueli <[email protected]>2021-09-14 09:29:45 +0800
commitf22424dcc5202eb83c37baddb028813acf04d236 (patch)
tree957f4bf2f82b8c4e8fd1b61f2d15666ec5de7bba
parent3aa13f90d7ef2338e1065ef316a5a0131e3d7df0 (diff)
TSG-7753: 修改quic_protocol_identify函数,增加输出VERSION/UA字段
-rw-r--r--inc/gquic.h4
-rw-r--r--src/gquic_process.cpp33
2 files changed, 22 insertions, 15 deletions
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)<RLOG_LV_FATAL ? printaddr(&(a->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;
}