@@ -104,7 +104,7 @@ start_packet(MysqlPcap *mp) {
104
104
ASSERT (ret >= 0 );
105
105
106
106
snprintf (mp -> filter , sizeof (mp -> filter ),
107
- "tcp port %d and tcp[tcpflags] & (tcp-push|tcp-ack) != 0" , mp -> mysqlPort );
107
+ "tcp port %d and tcp[tcpflags] & (tcp-push|tcp-ack|tcp-fin ) != 0" , mp -> mysqlPort );
108
108
109
109
if (pcap_compile (mp -> pd , & fcode , mp -> filter , 0 , mp -> netmask ) < 0 ) {
110
110
dump (L_ERR , "pcap_compile failed: %s" , pcap_geterr (mp -> pd ));
@@ -302,9 +302,14 @@ process_ip(MysqlPcap *mp, const struct ip *ip, struct timeval tv) {
302
302
#endif
303
303
ASSERT ((sport > 0 ) && (dport > 0 ));
304
304
305
- // Capture only "data" packets, ignore TCP control
306
- if (datalen == 0 )
305
+ /* sack datalen > 0 continue
306
+ fin possible ack = 1 continue
307
+ only filter pure ack packet
308
+ */
309
+ if ((tcp -> ack ) && (datalen == 0 ) && (!tcp -> fin )) {
310
+ dump (L_DEBUG , "skip a packet" );
307
311
break ;
312
+ }
308
313
/*
309
314
* for loopback, dst & src are all local_address
310
315
* so use port to distinguish
@@ -317,7 +322,8 @@ process_ip(MysqlPcap *mp, const struct ip *ip, struct timeval tv) {
317
322
}
318
323
319
324
char * data = (char * ) ((uchar * ) tcp + tcp -> doff * 4 );
320
- dump (L_DEBUG , "is_in:%c-datalen:%d-tcp:%u [%u]-[%u]" , incoming , datalen , ntohl (tcp -> seq ), dport ,sport );
325
+ dump (L_DEBUG , "is_in:%c-datalen:%d-tcp:%u [%u]-[%u] [%d-%d-%d]" , incoming , datalen , ntohl (tcp -> seq ), dport ,sport
326
+ ,tcp -> psh , tcp -> ack , tcp -> fin );
321
327
addPacketInfo (incoming , datalen , ntohl (tcp -> seq ), dport ,sport , data );
322
328
323
329
if (incoming == '1' ) {
@@ -386,7 +392,6 @@ inbound(MysqlPcap *mp, char* data, uint32 datalen,
386
392
uint32 sqlSaveLen = 0 ;
387
393
uint32_t * tcp_seq = NULL ;
388
394
389
- ASSERT (datalen > 0 );
390
395
ASSERT (data );
391
396
ASSERT (mp && mp -> hash && mp -> pd );
392
397
@@ -395,6 +400,14 @@ inbound(MysqlPcap *mp, char* data, uint32 datalen,
395
400
lport = dport ;
396
401
rport = sport ;
397
402
403
+ if (tcp -> fin ) {
404
+ ASSERT (datalen == 0 );
405
+ dump (L_DEBUG , "fin" );
406
+ hash_get_rem (mp -> hash , dst , src , lport , rport );
407
+ return OK ;
408
+ }
409
+ ASSERT (datalen > 0 );
410
+
398
411
status = hash_get_status (mp -> hash , dst , src ,
399
412
lport , rport , & sql , & sqlSaveLen , & tcp_seq , & cmd );
400
413
@@ -548,7 +561,7 @@ inbound(MysqlPcap *mp, char* data, uint32 datalen,
548
561
549
562
if (param_count != ERR ) {
550
563
ASSERT (param_count >= 0 );
551
- ASSERT (100 > param_count );
564
+ ASSERT (1000 > param_count );
552
565
/* prepare cant find, param_type in payload */
553
566
if ((param_count > 0 )
554
567
&& (datalen < sizeof (param ) - 200 )) {
@@ -708,6 +721,13 @@ outbound(MysqlPcap *mp, char *data, uint32 datalen,
708
721
lport = sport ;
709
722
rport = dport ;
710
723
724
+ if (tcp -> fin ) {
725
+ ASSERT (datalen == 0 );
726
+ dump (L_DEBUG , "fin" );
727
+ hash_get_rem (mp -> hash , src , dst , lport , rport );
728
+ return OK ;
729
+ }
730
+ ASSERT (datalen > 0 );
711
731
struct timeval tv2 ;
712
732
time_t tv_t ;
713
733
struct tm * tm ;
@@ -910,7 +930,7 @@ outbound(MysqlPcap *mp, char *data, uint32 datalen,
910
930
if (ret == 0 ) {
911
931
ASSERT (stmt_id > 0 );
912
932
ASSERT (param_count >= 0 );
913
- ASSERT (100 > param_count );
933
+ ASSERT (1000 > param_count );
914
934
hash_set_param_count (mp -> hash , src , dst ,
915
935
lport , rport , stmt_id , param_count );
916
936
dump (L_DEBUG , "prepare ok packet %d %d" , stmt_id , param_count );
0 commit comments