diff options
| author | liuxueli <[email protected]> | 2021-09-14 09:29:45 +0800 |
|---|---|---|
| committer | liuxueli <[email protected]> | 2021-09-14 09:29:45 +0800 |
| commit | f22424dcc5202eb83c37baddb028813acf04d236 (patch) | |
| tree | 957f4bf2f82b8c4e8fd1b61f2d15666ec5de7bba | |
| parent | 3aa13f90d7ef2338e1065ef316a5a0131e3d7df0 (diff) | |
TSG-7753: 修改quic_protocol_identify函数,增加输出VERSION/UA字段
| -rw-r--r-- | inc/gquic.h | 4 | ||||
| -rw-r--r-- | src/gquic_process.cpp | 33 |
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;
}
|
