diff --git a/src/session/gtest_session_manager.cpp b/src/session/gtest_session_manager.cpp
index e1f4110..b7feca1 100644
--- a/src/session/gtest_session_manager.cpp
+++ b/src/session/gtest_session_manager.cpp
@@ -5,7 +5,7 @@
#include "timestamp.h"
/******************************************************************************
- * test packet TCP
+ * test packet: HTTP www.example.com
******************************************************************************/
/*
@@ -281,6 +281,580 @@ unsigned char tcp_pkt3_c2s_ack[] = {
0xc0, 0xa8, 0x26, 0x69, 0x5d, 0xb8, 0xd8, 0x22, 0xea, 0xcf, 0x00, 0x50, 0x7c, 0x8c, 0x89, 0x2d, 0x52, 0x57, 0x49, 0x63, 0x80, 0x10, 0x08, 0x04, 0xea, 0xce,
0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x2c, 0x2b, 0x33, 0xa0, 0x48, 0x74, 0x32, 0x2a};
+/*
+ * Frame 4: 145 bytes on wire (1160 bits), 145 bytes captured (1160 bits) on interface en0, id 0
+ * Ethernet II, Src: Apple_0a:c5:ea (3c:a6:f6:0a:c5:ea), Dst: NewH3CTe_96:38:0e (48:73:97:96:38:0e)
+ * Destination: NewH3CTe_96:38:0e (48:73:97:96:38:0e)
+ * Source: Apple_0a:c5:ea (3c:a6:f6:0a:c5:ea)
+ * Type: IPv4 (0x0800)
+ * Internet Protocol Version 4, Src: 192.168.38.105, Dst: 93.184.216.34
+ * 0100 .... = Version: 4
+ * .... 0101 = Header Length: 20 bytes (5)
+ * Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
+ * 0000 00.. = Differentiated Services Codepoint: Default (0)
+ * .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
+ * Total Length: 131
+ * Identification: 0x0000 (0)
+ * 010. .... = Flags: 0x2, Don't fragment
+ * 0... .... = Reserved bit: Not set
+ * .1.. .... = Don't fragment: Set
+ * ..0. .... = More fragments: Not set
+ * ...0 0000 0000 0000 = Fragment Offset: 0
+ * Time to Live: 64
+ * Protocol: TCP (6)
+ * Header Checksum: 0x1d89 [correct]
+ * [Header checksum status: Good]
+ * [Calculated Checksum: 0x1d89]
+ * Source Address: 192.168.38.105
+ * Destination Address: 93.184.216.34
+ * Transmission Control Protocol, Src Port: 60111, Dst Port: 80, Seq: 1, Ack: 1, Len: 79
+ * Source Port: 60111
+ * Destination Port: 80
+ * [Stream index: 0]
+ * [Conversation completeness: Complete, WITH_DATA (31)]
+ * [TCP Segment Len: 79]
+ * Sequence Number: 1 (relative sequence number)
+ * Sequence Number (raw): 2089584941
+ * [Next Sequence Number: 80 (relative sequence number)]
+ * Acknowledgment Number: 1 (relative ack number)
+ * Acknowledgment number (raw): 1381452131
+ * 1000 .... = Header Length: 32 bytes (8)
+ * Flags: 0x018 (PSH, ACK)
+ * 000. .... .... = Reserved: Not set
+ * ...0 .... .... = Accurate ECN: Not set
+ * .... 0... .... = Congestion Window Reduced: Not set
+ * .... .0.. .... = ECN-Echo: Not set
+ * .... ..0. .... = Urgent: Not set
+ * .... ...1 .... = Acknowledgment: Set
+ * .... .... 1... = Push: Set
+ * .... .... .0.. = Reset: Not set
+ * .... .... ..0. = Syn: Not set
+ * .... .... ...0 = Fin: Not set
+ * [TCP Flags: ·······AP···]
+ * Window: 2052
+ * [Calculated window size: 131328]
+ * [Window size scaling factor: 64]
+ * Checksum: 0x59f8 [correct]
+ * [Checksum Status: Good]
+ * [Calculated Checksum: 0x59f8]
+ * Urgent Pointer: 0
+ * Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps
+ * TCP Option - No-Operation (NOP)
+ * Kind: No-Operation (1)
+ * TCP Option - No-Operation (NOP)
+ * Kind: No-Operation (1)
+ * TCP Option - Timestamps
+ * Kind: Time Stamp Option (8)
+ * Length: 10
+ * Timestamp value: 741028768: TSval 741028768, TSecr 1215574570
+ * Timestamp echo reply: 1215574570
+ * [Timestamps]
+ * [Time since first frame in this TCP stream: 0.262783000 seconds]
+ * [Time since previous frame in this TCP stream: 0.000218000 seconds]
+ * [SEQ/ACK analysis]
+ * [iRTT: 0.262565000 seconds]
+ * [Bytes in flight: 79]
+ * [Bytes sent since last PSH flag: 79]
+ * TCP payload (79 bytes)
+ * Hypertext Transfer Protocol
+ * GET / HTTP/1.1\r\n
+ * [Expert Info (Chat/Sequence): GET / HTTP/1.1\r\n]
+ * [GET / HTTP/1.1\r\n]
+ * [Severity level: Chat]
+ * [Group: Sequence]
+ * Request Method: GET
+ * Request URI: /
+ * Request Version: HTTP/1.1
+ * Host: www.example.com\r\n
+ * User-Agent: curl/7.64.1\r\n
+ */
+// Accept: */*\r\n
+// \r\n
+// [Full request URI: http://www.example.com/]
+// [HTTP request 1/1]
+// [Response in frame: 7]
+
+unsigned char tcp_pkt4_c2s_http_req[] = {
+ 0x48, 0x73, 0x97, 0x96, 0x38, 0x0e, 0x3c, 0xa6, 0xf6, 0x0a, 0xc5, 0xea, 0x08, 0x00, 0x45, 0x00, 0x00, 0x83, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06, 0x1d, 0x89,
+ 0xc0, 0xa8, 0x26, 0x69, 0x5d, 0xb8, 0xd8, 0x22, 0xea, 0xcf, 0x00, 0x50, 0x7c, 0x8c, 0x89, 0x2d, 0x52, 0x57, 0x49, 0x63, 0x80, 0x18, 0x08, 0x04, 0x59, 0xf8,
+ 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x2c, 0x2b, 0x33, 0xa0, 0x48, 0x74, 0x32, 0x2a, 0x47, 0x45, 0x54, 0x20, 0x2f, 0x20, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31,
+ 0x2e, 0x31, 0x0d, 0x0a, 0x48, 0x6f, 0x73, 0x74, 0x3a, 0x20, 0x77, 0x77, 0x77, 0x2e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x0d,
+ 0x0a, 0x55, 0x73, 0x65, 0x72, 0x2d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x63, 0x75, 0x72, 0x6c, 0x2f, 0x37, 0x2e, 0x36, 0x34, 0x2e, 0x31, 0x0d, 0x0a,
+ 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x3a, 0x20, 0x2a, 0x2f, 0x2a, 0x0d, 0x0a, 0x0d, 0x0a};
+
+/*
+ * Frame 5: 66 bytes on wire (528 bits), 66 bytes captured (528 bits) on interface en0, id 0
+ * Ethernet II, Src: NewH3CTe_96:38:0e (48:73:97:96:38:0e), Dst: Apple_0a:c5:ea (3c:a6:f6:0a:c5:ea)
+ * Destination: Apple_0a:c5:ea (3c:a6:f6:0a:c5:ea)
+ * Source: NewH3CTe_96:38:0e (48:73:97:96:38:0e)
+ * Type: IPv4 (0x0800)
+ * Internet Protocol Version 4, Src: 93.184.216.34, Dst: 192.168.38.105
+ * 0100 .... = Version: 4
+ * .... 0101 = Header Length: 20 bytes (5)
+ * Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
+ * 0000 00.. = Differentiated Services Codepoint: Default (0)
+ * .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
+ * Total Length: 52
+ * Identification: 0xd6b0 (54960)
+ * 000. .... = Flags: 0x0
+ * 0... .... = Reserved bit: Not set
+ * .0.. .... = Don't fragment: Not set
+ * ..0. .... = More fragments: Not set
+ * ...0 0000 0000 0000 = Fragment Offset: 0
+ * Time to Live: 42
+ * Protocol: TCP (6)
+ * Header Checksum: 0x9d27 [correct]
+ * [Header checksum status: Good]
+ * [Calculated Checksum: 0x9d27]
+ * Source Address: 93.184.216.34
+ * Destination Address: 192.168.38.105
+ * Transmission Control Protocol, Src Port: 80, Dst Port: 60111, Seq: 1, Ack: 80, Len: 0
+ * Source Port: 80
+ * Destination Port: 60111
+ * [Stream index: 0]
+ * [Conversation completeness: Complete, WITH_DATA (31)]
+ * [TCP Segment Len: 0]
+ * Sequence Number: 1 (relative sequence number)
+ * Sequence Number (raw): 1381452131
+ * [Next Sequence Number: 1 (relative sequence number)]
+ * Acknowledgment Number: 80 (relative ack number)
+ * Acknowledgment number (raw): 2089585020
+ * 1000 .... = Header Length: 32 bytes (8)
+ * Flags: 0x010 (ACK)
+ * 000. .... .... = Reserved: Not set
+ * ...0 .... .... = Accurate ECN: Not set
+ * .... 0... .... = Congestion Window Reduced: Not set
+ * .... .0.. .... = ECN-Echo: Not set
+ * .... ..0. .... = Urgent: Not set
+ * .... ...1 .... = Acknowledgment: Set
+ * .... .... 0... = Push: Not set
+ * .... .... .0.. = Reset: Not set
+ * .... .... ..0. = Syn: Not set
+ * .... .... ...0 = Fin: Not set
+ * [TCP Flags: ·······A····]
+ * Window: 128
+ * [Calculated window size: 65536]
+ * [Window size scaling factor: 512]
+ * Checksum: 0xf0fd [correct]
+ * [Checksum Status: Good]
+ * [Calculated Checksum: 0xf0fd]
+ * Urgent Pointer: 0
+ * Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps
+ * TCP Option - No-Operation (NOP)
+ * Kind: No-Operation (1)
+ * TCP Option - No-Operation (NOP)
+ * Kind: No-Operation (1)
+ * TCP Option - Timestamps
+ * Kind: Time Stamp Option (8)
+ * Length: 10
+ * Timestamp value: 1215574832: TSval 1215574832, TSecr 741028768
+ * Timestamp echo reply: 741028768
+ * [Timestamps]
+ * [Time since first frame in this TCP stream: 0.568134000 seconds]
+ * [Time since previous frame in this TCP stream: 0.305351000 seconds]
+ * [SEQ/ACK analysis]
+ * [This is an ACK to the segment in frame: 4]
+ * [The RTT to ACK the segment was: 0.305351000 seconds]
+ * [iRTT: 0.262565000 seconds]
+ */
+
+unsigned char tcp_pkt5_s2c_ack[] = {
+ 0x3c, 0xa6, 0xf6, 0x0a, 0xc5, 0xea, 0x48, 0x73, 0x97, 0x96, 0x38, 0x0e, 0x08, 0x00, 0x45, 0x00, 0x00, 0x34, 0xd6, 0xb0, 0x00, 0x00, 0x2a, 0x06, 0x9d, 0x27,
+ 0x5d, 0xb8, 0xd8, 0x22, 0xc0, 0xa8, 0x26, 0x69, 0x00, 0x50, 0xea, 0xcf, 0x52, 0x57, 0x49, 0x63, 0x7c, 0x8c, 0x89, 0x7c, 0x80, 0x10, 0x00, 0x80, 0xf0, 0xfd,
+ 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x48, 0x74, 0x33, 0x30, 0x2c, 0x2b, 0x33, 0xa0};
+
+/*
+ * Frame 6: 1354 bytes on wire (10832 bits), 1354 bytes captured (10832 bits) on interface en0, id 0
+ * Ethernet II, Src: NewH3CTe_96:38:0e (48:73:97:96:38:0e), Dst: Apple_0a:c5:ea (3c:a6:f6:0a:c5:ea)
+ * Destination: Apple_0a:c5:ea (3c:a6:f6:0a:c5:ea)
+ * Source: NewH3CTe_96:38:0e (48:73:97:96:38:0e)
+ * Type: IPv4 (0x0800)
+ * Internet Protocol Version 4, Src: 93.184.216.34, Dst: 192.168.38.105
+ * 0100 .... = Version: 4
+ * .... 0101 = Header Length: 20 bytes (5)
+ * Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
+ * 0000 00.. = Differentiated Services Codepoint: Default (0)
+ * .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
+ * Total Length: 1340
+ * Identification: 0xd6b1 (54961)
+ * 000. .... = Flags: 0x0
+ * 0... .... = Reserved bit: Not set
+ * .0.. .... = Don't fragment: Not set
+ * ..0. .... = More fragments: Not set
+ * ...0 0000 0000 0000 = Fragment Offset: 0
+ * Time to Live: 42
+ * Protocol: TCP (6)
+ * Header Checksum: 0x981e [correct]
+ * [Header checksum status: Good]
+ * [Calculated Checksum: 0x981e]
+ * Source Address: 93.184.216.34
+ * Destination Address: 192.168.38.105
+ * Transmission Control Protocol, Src Port: 80, Dst Port: 60111, Seq: 1, Ack: 80, Len: 1288
+ * Source Port: 80
+ * Destination Port: 60111
+ * [Stream index: 0]
+ * [Conversation completeness: Complete, WITH_DATA (31)]
+ * [TCP Segment Len: 1288]
+ * Sequence Number: 1 (relative sequence number)
+ * Sequence Number (raw): 1381452131
+ * [Next Sequence Number: 1289 (relative sequence number)]
+ * Acknowledgment Number: 80 (relative ack number)
+ * Acknowledgment number (raw): 2089585020
+ * 1000 .... = Header Length: 32 bytes (8)
+ * Flags: 0x010 (ACK)
+ * 000. .... .... = Reserved: Not set
+ * ...0 .... .... = Accurate ECN: Not set
+ * .... 0... .... = Congestion Window Reduced: Not set
+ * .... .0.. .... = ECN-Echo: Not set
+ * .... ..0. .... = Urgent: Not set
+ * .... ...1 .... = Acknowledgment: Set
+ * .... .... 0... = Push: Not set
+ * .... .... .0.. = Reset: Not set
+ * .... .... ..0. = Syn: Not set
+ * .... .... ...0 = Fin: Not set
+ * [TCP Flags: ·······A····]
+ * Window: 128
+ * [Calculated window size: 65536]
+ * [Window size scaling factor: 512]
+ * Checksum: 0xe543 [correct]
+ * [Checksum Status: Good]
+ * [Calculated Checksum: 0xe543]
+ * Urgent Pointer: 0
+ * Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps
+ * TCP Option - No-Operation (NOP)
+ * Kind: No-Operation (1)
+ * TCP Option - No-Operation (NOP)
+ * Kind: No-Operation (1)
+ * TCP Option - Timestamps
+ * Kind: Time Stamp Option (8)
+ * Length: 10
+ * Timestamp value: 1215574833: TSval 1215574833, TSecr 741028768
+ * Timestamp echo reply: 741028768
+ * [Timestamps]
+ * [Time since first frame in this TCP stream: 0.568147000 seconds]
+ * [Time since previous frame in this TCP stream: 0.000013000 seconds]
+ * [SEQ/ACK analysis]
+ * [iRTT: 0.262565000 seconds]
+ * [Bytes in flight: 1288]
+ * [Bytes sent since last PSH flag: 1288]
+ * TCP payload (1288 bytes)
+ * [Reassembled PDU in frame: 7]
+ * TCP segment data (1288 bytes)
+ */
+
+unsigned char tcp_pkt6_s2c_http_resq_1[] = {
+ 0x3c, 0xa6, 0xf6, 0x0a, 0xc5, 0xea, 0x48, 0x73, 0x97, 0x96, 0x38, 0x0e, 0x08, 0x00, 0x45, 0x00, 0x05, 0x3c, 0xd6, 0xb1, 0x00, 0x00, 0x2a, 0x06, 0x98, 0x1e,
+ 0x5d, 0xb8, 0xd8, 0x22, 0xc0, 0xa8, 0x26, 0x69, 0x00, 0x50, 0xea, 0xcf, 0x52, 0x57, 0x49, 0x63, 0x7c, 0x8c, 0x89, 0x7c, 0x80, 0x10, 0x00, 0x80, 0xe5, 0x43,
+ 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x48, 0x74, 0x33, 0x31, 0x2c, 0x2b, 0x33, 0xa0, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, 0x2e, 0x31, 0x20, 0x32, 0x30, 0x30,
+ 0x20, 0x4f, 0x4b, 0x0d, 0x0a, 0x41, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x3a, 0x20, 0x62, 0x79, 0x74, 0x65, 0x73, 0x0d,
+ 0x0a, 0x41, 0x67, 0x65, 0x3a, 0x20, 0x33, 0x34, 0x32, 0x30, 0x34, 0x38, 0x0d, 0x0a, 0x43, 0x61, 0x63, 0x68, 0x65, 0x2d, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f,
+ 0x6c, 0x3a, 0x20, 0x6d, 0x61, 0x78, 0x2d, 0x61, 0x67, 0x65, 0x3d, 0x36, 0x30, 0x34, 0x38, 0x30, 0x30, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74,
+ 0x2d, 0x54, 0x79, 0x70, 0x65, 0x3a, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d,
+ 0x55, 0x54, 0x46, 0x2d, 0x38, 0x0d, 0x0a, 0x44, 0x61, 0x74, 0x65, 0x3a, 0x20, 0x54, 0x75, 0x65, 0x2c, 0x20, 0x31, 0x39, 0x20, 0x44, 0x65, 0x63, 0x20, 0x32,
+ 0x30, 0x32, 0x33, 0x20, 0x30, 0x38, 0x3a, 0x32, 0x36, 0x3a, 0x35, 0x36, 0x20, 0x47, 0x4d, 0x54, 0x0d, 0x0a, 0x45, 0x74, 0x61, 0x67, 0x3a, 0x20, 0x22, 0x33,
+ 0x31, 0x34, 0x37, 0x35, 0x32, 0x36, 0x39, 0x34, 0x37, 0x22, 0x0d, 0x0a, 0x45, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x3a, 0x20, 0x54, 0x75, 0x65, 0x2c, 0x20,
+ 0x32, 0x36, 0x20, 0x44, 0x65, 0x63, 0x20, 0x32, 0x30, 0x32, 0x33, 0x20, 0x30, 0x38, 0x3a, 0x32, 0x36, 0x3a, 0x35, 0x36, 0x20, 0x47, 0x4d, 0x54, 0x0d, 0x0a,
+ 0x4c, 0x61, 0x73, 0x74, 0x2d, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x3a, 0x20, 0x54, 0x68, 0x75, 0x2c, 0x20, 0x31, 0x37, 0x20, 0x4f, 0x63, 0x74,
+ 0x20, 0x32, 0x30, 0x31, 0x39, 0x20, 0x30, 0x37, 0x3a, 0x31, 0x38, 0x3a, 0x32, 0x36, 0x20, 0x47, 0x4d, 0x54, 0x0d, 0x0a, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
+ 0x3a, 0x20, 0x45, 0x43, 0x53, 0x20, 0x28, 0x73, 0x65, 0x64, 0x2f, 0x35, 0x38, 0x41, 0x41, 0x29, 0x0d, 0x0a, 0x56, 0x61, 0x72, 0x79, 0x3a, 0x20, 0x41, 0x63,
+ 0x63, 0x65, 0x70, 0x74, 0x2d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x0d, 0x0a, 0x58, 0x2d, 0x43, 0x61, 0x63, 0x68, 0x65, 0x3a, 0x20, 0x48, 0x49,
+ 0x54, 0x0d, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, 0x20, 0x31, 0x32, 0x35, 0x36, 0x0d, 0x0a, 0x0d,
+ 0x0a, 0x3c, 0x21, 0x64, 0x6f, 0x63, 0x74, 0x79, 0x70, 0x65, 0x20, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a, 0x3c, 0x68,
+ 0x65, 0x61, 0x64, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x44, 0x6f,
+ 0x6d, 0x61, 0x69, 0x6e, 0x3c, 0x2f, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x3e, 0x0a, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x63, 0x68,
+ 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x22, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61,
+ 0x20, 0x68, 0x74, 0x74, 0x70, 0x2d, 0x65, 0x71, 0x75, 0x69, 0x76, 0x3d, 0x22, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x22,
+ 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3b, 0x20, 0x63, 0x68, 0x61, 0x72, 0x73,
+ 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x6d, 0x65, 0x74, 0x61, 0x20, 0x6e, 0x61, 0x6d,
+ 0x65, 0x3d, 0x22, 0x76, 0x69, 0x65, 0x77, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x3d, 0x22, 0x77, 0x69, 0x64, 0x74,
+ 0x68, 0x3d, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x2c, 0x20, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x2d, 0x73, 0x63,
+ 0x61, 0x6c, 0x65, 0x3d, 0x31, 0x22, 0x20, 0x2f, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x3d,
+ 0x22, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x63, 0x73, 0x73, 0x22, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x66, 0x30,
+ 0x66, 0x30, 0x66, 0x32, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x3b, 0x0a, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x30, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x66, 0x6f, 0x6e, 0x74, 0x2d, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x3a, 0x20, 0x2d, 0x61, 0x70, 0x70, 0x6c, 0x65, 0x2d, 0x73, 0x79, 0x73, 0x74, 0x65,
+ 0x6d, 0x2c, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2d, 0x75, 0x69, 0x2c, 0x20, 0x42, 0x6c, 0x69, 0x6e, 0x6b, 0x4d, 0x61, 0x63, 0x53, 0x79, 0x73, 0x74,
+ 0x65, 0x6d, 0x46, 0x6f, 0x6e, 0x74, 0x2c, 0x20, 0x22, 0x53, 0x65, 0x67, 0x6f, 0x65, 0x20, 0x55, 0x49, 0x22, 0x2c, 0x20, 0x22, 0x4f, 0x70, 0x65, 0x6e, 0x20,
+ 0x53, 0x61, 0x6e, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x48, 0x65, 0x6c, 0x76, 0x65, 0x74, 0x69, 0x63, 0x61, 0x20, 0x4e, 0x65, 0x75, 0x65, 0x22, 0x2c, 0x20, 0x48,
+ 0x65, 0x6c, 0x76, 0x65, 0x74, 0x69, 0x63, 0x61, 0x2c, 0x20, 0x41, 0x72, 0x69, 0x61, 0x6c, 0x2c, 0x20, 0x73, 0x61, 0x6e, 0x73, 0x2d, 0x73, 0x65, 0x72, 0x69,
+ 0x66, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x76, 0x20,
+ 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x36, 0x30, 0x30, 0x70, 0x78, 0x3b, 0x0a, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x35, 0x65, 0x6d, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x0a, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x70, 0x61, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x20, 0x32, 0x65, 0x6d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x67, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x2d, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x3a, 0x20, 0x23, 0x66, 0x64, 0x66, 0x64, 0x66,
+ 0x66, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x2d, 0x72, 0x61, 0x64, 0x69, 0x75, 0x73, 0x3a, 0x20,
+ 0x30, 0x2e, 0x35, 0x65, 0x6d, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x62, 0x6f, 0x78, 0x2d, 0x73, 0x68, 0x61, 0x64, 0x6f, 0x77, 0x3a,
+ 0x20, 0x32, 0x70, 0x78, 0x20, 0x33, 0x70, 0x78, 0x20, 0x37, 0x70, 0x78, 0x20, 0x32, 0x70, 0x78, 0x20, 0x72, 0x67, 0x62, 0x61, 0x28, 0x30, 0x2c, 0x30, 0x2c,
+ 0x30, 0x2c, 0x30, 0x2e, 0x30, 0x32, 0x29, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x61, 0x3a, 0x6c, 0x69, 0x6e, 0x6b, 0x2c,
+ 0x20, 0x61, 0x3a, 0x76, 0x69, 0x73, 0x69, 0x74, 0x65, 0x64, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x63, 0x6f, 0x6c, 0x6f, 0x72,
+ 0x3a, 0x20, 0x23, 0x33, 0x38, 0x34, 0x38, 0x38, 0x66, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x74, 0x65, 0x78, 0x74, 0x2d, 0x64, 0x65,
+ 0x63, 0x6f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x20, 0x6e, 0x6f, 0x6e, 0x65, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20,
+ 0x40, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x28, 0x6d, 0x61, 0x78, 0x2d, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x37, 0x30, 0x30, 0x70, 0x78, 0x29, 0x20,
+ 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x64, 0x69, 0x76, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x6d, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x3a, 0x20, 0x30, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x77, 0x69, 0x64, 0x74, 0x68, 0x3a, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x3b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d,
+ 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x2f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x3e, 0x20, 0x20, 0x20, 0x20, 0x0a, 0x3c, 0x2f,
+ 0x68, 0x65};
+
+/*
+ * Frame 7: 385 bytes on wire (3080 bits), 385 bytes captured (3080 bits) on interface en0, id 0
+ * Ethernet II, Src: NewH3CTe_96:38:0e (48:73:97:96:38:0e), Dst: Apple_0a:c5:ea (3c:a6:f6:0a:c5:ea)
+ * Destination: Apple_0a:c5:ea (3c:a6:f6:0a:c5:ea)
+ * Source: NewH3CTe_96:38:0e (48:73:97:96:38:0e)
+ * Type: IPv4 (0x0800)
+ * Internet Protocol Version 4, Src: 93.184.216.34, Dst: 192.168.38.105
+ * 0100 .... = Version: 4
+ * .... 0101 = Header Length: 20 bytes (5)
+ * Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
+ * 0000 00.. = Differentiated Services Codepoint: Default (0)
+ * .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
+ * Total Length: 371
+ * Identification: 0xd6b2 (54962)
+ * 000. .... = Flags: 0x0
+ * 0... .... = Reserved bit: Not set
+ * .0.. .... = Don't fragment: Not set
+ * ..0. .... = More fragments: Not set
+ * ...0 0000 0000 0000 = Fragment Offset: 0
+ * Time to Live: 42
+ * Protocol: TCP (6)
+ * Header Checksum: 0x9be6 [correct]
+ * [Header checksum status: Good]
+ * [Calculated Checksum: 0x9be6]
+ * Source Address: 93.184.216.34
+ * Destination Address: 192.168.38.105
+ * Transmission Control Protocol, Src Port: 80, Dst Port: 60111, Seq: 1289, Ack: 80, Len: 319
+ * Source Port: 80
+ * Destination Port: 60111
+ * [Stream index: 0]
+ * [Conversation completeness: Complete, WITH_DATA (31)]
+ * [TCP Segment Len: 319]
+ * Sequence Number: 1289 (relative sequence number)
+ * Sequence Number (raw): 1381453419
+ * [Next Sequence Number: 1608 (relative sequence number)]
+ * Acknowledgment Number: 80 (relative ack number)
+ * Acknowledgment number (raw): 2089585020
+ * 1000 .... = Header Length: 32 bytes (8)
+ * Flags: 0x018 (PSH, ACK)
+ * 000. .... .... = Reserved: Not set
+ * ...0 .... .... = Accurate ECN: Not set
+ * .... 0... .... = Congestion Window Reduced: Not set
+ * .... .0.. .... = ECN-Echo: Not set
+ * .... ..0. .... = Urgent: Not set
+ * .... ...1 .... = Acknowledgment: Set
+ * .... .... 1... = Push: Set
+ * .... .... .0.. = Reset: Not set
+ * .... .... ..0. = Syn: Not set
+ * .... .... ...0 = Fin: Not set
+ * [TCP Flags: ·······AP···]
+ * Window: 128
+ * [Calculated window size: 65536]
+ * [Window size scaling factor: 512]
+ * Checksum: 0x955e [correct]
+ * [Checksum Status: Good]
+ * [Calculated Checksum: 0x955e]
+ * Urgent Pointer: 0
+ * Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps
+ * TCP Option - No-Operation (NOP)
+ * Kind: No-Operation (1)
+ * TCP Option - No-Operation (NOP)
+ * Kind: No-Operation (1)
+ * TCP Option - Timestamps
+ * Kind: Time Stamp Option (8)
+ * Length: 10
+ * Timestamp value: 1215574833: TSval 1215574833, TSecr 741028768
+ * Timestamp echo reply: 741028768
+ * [Timestamps]
+ * [Time since first frame in this TCP stream: 0.568149000 seconds]
+ * [Time since previous frame in this TCP stream: 0.000002000 seconds]
+ * [SEQ/ACK analysis]
+ * [iRTT: 0.262565000 seconds]
+ * [Bytes in flight: 1607]
+ * [Bytes sent since last PSH flag: 1607]
+ * TCP payload (319 bytes)
+ * TCP segment data (319 bytes)
+ * [2 Reassembled TCP Segments (1607 bytes): #6(1288), #7(319)]
+ * [Frame: 6, payload: 0-1287 (1288 bytes)]
+ * [Frame: 7, payload: 1288-1606 (319 bytes)]
+ * [Segment count: 2]
+ * [Reassembled TCP length: 1607]
+ * [Reassembled TCP Data: 485454502f312e3120323030204f4b0d0a4163636570742d52616e6765733a2062797465…]
+ * Hypertext Transfer Protocol
+ * HTTP/1.1 200 OK\r\n
+ * [Expert Info (Chat/Sequence): HTTP/1.1 200 OK\r\n]
+ * [HTTP/1.1 200 OK\r\n]
+ * [Severity level: Chat]
+ * [Group: Sequence]
+ * Response Version: HTTP/1.1
+ * Status Code: 200
+ * [Status Code Description: OK]
+ * Response Phrase: OK
+ * Accept-Ranges: bytes\r\n
+ * Age: 342048\r\n
+ * Cache-Control: max-age=604800\r\n
+ * Content-Type: text/html; charset=UTF-8\r\n
+ * Date: Tue, 19 Dec 2023 08:26:56 GMT\r\n
+ * Etag: "3147526947"\r\n
+ * Expires: Tue, 26 Dec 2023 08:26:56 GMT\r\n
+ * Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT\r\n
+ * Server: ECS (sed/58AA)\r\n
+ * Vary: Accept-Encoding\r\n
+ * X-Cache: HIT\r\n
+ * Content-Length: 1256\r\n
+ * [Content length: 1256]
+ * \r\n
+ * [HTTP response 1/1]
+ * [Time since request: 0.305366000 seconds]
+ * [Request in frame: 4]
+ * [Request URI: http://www.example.com/]
+ * File Data: 1256 bytes
+ * Line-based text data: text/html (46 lines)
+ * \n
+ * \n
+ *
\n
+ * Example Domain\n
+ * \n
+ * \n
+ * \n
+ * \n
+ * \n
+ * \n
+ * \n
+ * \n
+ * \n
+ *
Example Domain
\n
+ *
This domain is for use in illustrative examples in documents. You may use this\n
+ * domain in literature without prior coordination or asking for permission.
\n
+ *
More information...
\n
+ *
\n
+ * \n
+ * \n
+ */
+
+unsigned char tcp_pkt7_s2c_http_resp_2[] = {
+ 0x3c, 0xa6, 0xf6, 0x0a, 0xc5, 0xea, 0x48, 0x73, 0x97, 0x96, 0x38, 0x0e, 0x08, 0x00, 0x45, 0x00, 0x01, 0x73, 0xd6, 0xb2, 0x00, 0x00, 0x2a, 0x06, 0x9b, 0xe6,
+ 0x5d, 0xb8, 0xd8, 0x22, 0xc0, 0xa8, 0x26, 0x69, 0x00, 0x50, 0xea, 0xcf, 0x52, 0x57, 0x4e, 0x6b, 0x7c, 0x8c, 0x89, 0x7c, 0x80, 0x18, 0x00, 0x80, 0x95, 0x5e,
+ 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x48, 0x74, 0x33, 0x31, 0x2c, 0x2b, 0x33, 0xa0, 0x61, 0x64, 0x3e, 0x0a, 0x0a, 0x3c, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a,
+ 0x3c, 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x68, 0x31, 0x3e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x20, 0x44, 0x6f, 0x6d, 0x61,
+ 0x69, 0x6e, 0x3c, 0x2f, 0x68, 0x31, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70, 0x3e, 0x54, 0x68, 0x69, 0x73, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,
+ 0x20, 0x69, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x75, 0x73, 0x65, 0x20, 0x69, 0x6e, 0x20, 0x69, 0x6c, 0x6c, 0x75, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x76,
+ 0x65, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x20, 0x59,
+ 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e,
+ 0x20, 0x69, 0x6e, 0x20, 0x6c, 0x69, 0x74, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x70, 0x72, 0x69,
+ 0x6f, 0x72, 0x20, 0x63, 0x6f, 0x6f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x73, 0x6b, 0x69, 0x6e, 0x67, 0x20,
+ 0x66, 0x6f, 0x72, 0x20, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x3c, 0x70,
+ 0x3e, 0x3c, 0x61, 0x20, 0x68, 0x72, 0x65, 0x66, 0x3d, 0x22, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x61, 0x6e, 0x61,
+ 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0x3e, 0x4d, 0x6f, 0x72, 0x65,
+ 0x20, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x2e, 0x2e, 0x3c, 0x2f, 0x61, 0x3e, 0x3c, 0x2f, 0x70, 0x3e, 0x0a, 0x3c, 0x2f,
+ 0x64, 0x69, 0x76, 0x3e, 0x0a, 0x3c, 0x2f, 0x62, 0x6f, 0x64, 0x79, 0x3e, 0x0a, 0x3c, 0x2f, 0x68, 0x74, 0x6d, 0x6c, 0x3e, 0x0a};
+
+/*
+ * Frame 8: 66 bytes on wire (528 bits), 66 bytes captured (528 bits) on interface en0, id 0
+ * Ethernet II, Src: Apple_0a:c5:ea (3c:a6:f6:0a:c5:ea), Dst: NewH3CTe_96:38:0e (48:73:97:96:38:0e)
+ * Destination: NewH3CTe_96:38:0e (48:73:97:96:38:0e)
+ * Source: Apple_0a:c5:ea (3c:a6:f6:0a:c5:ea)
+ * Type: IPv4 (0x0800)
+ * Internet Protocol Version 4, Src: 192.168.38.105, Dst: 93.184.216.34
+ * 0100 .... = Version: 4
+ * .... 0101 = Header Length: 20 bytes (5)
+ * Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
+ * 0000 00.. = Differentiated Services Codepoint: Default (0)
+ * .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
+ * Total Length: 52
+ * Identification: 0x0000 (0)
+ * 010. .... = Flags: 0x2, Don't fragment
+ * 0... .... = Reserved bit: Not set
+ * .1.. .... = Don't fragment: Set
+ * ..0. .... = More fragments: Not set
+ * ...0 0000 0000 0000 = Fragment Offset: 0
+ * Time to Live: 64
+ * Protocol: TCP (6)
+ * Header Checksum: 0x1dd8 [correct]
+ * [Header checksum status: Good]
+ * [Calculated Checksum: 0x1dd8]
+ * Source Address: 192.168.38.105
+ * Destination Address: 93.184.216.34
+ * Transmission Control Protocol, Src Port: 60111, Dst Port: 80, Seq: 80, Ack: 1608, Len: 0
+ * Source Port: 60111
+ * Destination Port: 80
+ * [Stream index: 0]
+ * [Conversation completeness: Complete, WITH_DATA (31)]
+ * [TCP Segment Len: 0]
+ * Sequence Number: 80 (relative sequence number)
+ * Sequence Number (raw): 2089585020
+ * [Next Sequence Number: 80 (relative sequence number)]
+ * Acknowledgment Number: 1608 (relative ack number)
+ * Acknowledgment number (raw): 1381453738
+ * 1000 .... = Header Length: 32 bytes (8)
+ * Flags: 0x010 (ACK)
+ * 000. .... .... = Reserved: Not set
+ * ...0 .... .... = Accurate ECN: Not set
+ * .... 0... .... = Congestion Window Reduced: Not set
+ * .... .0.. .... = ECN-Echo: Not set
+ * .... ..0. .... = Urgent: Not set
+ * .... ...1 .... = Acknowledgment: Set
+ * .... .... 0... = Push: Not set
+ * .... .... .0.. = Reset: Not set
+ * .... .... ..0. = Syn: Not set
+ * .... .... ...0 = Fin: Not set
+ * [TCP Flags: ·······A····]
+ * Window: 2027
+ * [Calculated window size: 129728]
+ * [Window size scaling factor: 64]
+ * Checksum: 0xe219 [correct]
+ * [Checksum Status: Good]
+ * [Calculated Checksum: 0xe219]
+ * Urgent Pointer: 0
+ * Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps
+ * TCP Option - No-Operation (NOP)
+ * Kind: No-Operation (1)
+ * TCP Option - No-Operation (NOP)
+ * Kind: No-Operation (1)
+ * TCP Option - Timestamps
+ * Kind: Time Stamp Option (8)
+ * Length: 10
+ * Timestamp value: 741029073: TSval 741029073, TSecr 1215574833
+ * Timestamp echo reply: 1215574833
+ * [Timestamps]
+ * [Time since first frame in this TCP stream: 0.568399000 seconds]
+ * [Time since previous frame in this TCP stream: 0.000250000 seconds]
+ * [SEQ/ACK analysis]
+ * [This is an ACK to the segment in frame: 7]
+ * [The RTT to ACK the segment was: 0.000250000 seconds]
+ * [iRTT: 0.262565000 seconds]
+ */
+
+unsigned char tcp_pkt8_c2s_ack[] = {
+ 0x48, 0x73, 0x97, 0x96, 0x38, 0x0e, 0x3c, 0xa6, 0xf6, 0x0a, 0xc5, 0xea, 0x08, 0x00, 0x45, 0x00, 0x00, 0x34, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06, 0x1d, 0xd8,
+ 0xc0, 0xa8, 0x26, 0x69, 0x5d, 0xb8, 0xd8, 0x22, 0xea, 0xcf, 0x00, 0x50, 0x7c, 0x8c, 0x89, 0x7c, 0x52, 0x57, 0x4f, 0xaa, 0x80, 0x10, 0x07, 0xeb, 0xe2, 0x19,
+ 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x2c, 0x2b, 0x34, 0xd1, 0x48, 0x74, 0x33, 0x31};
+
/*
* Frame 9: 66 bytes on wire (528 bits), 66 bytes captured (528 bits) on interface en0, id 0
* Ethernet II, Src: Apple_0a:c5:ea (3c:a6:f6:0a:c5:ea), Dst: NewH3CTe_96:38:0e (48:73:97:96:38:0e)
@@ -361,7 +935,7 @@ unsigned char tcp_pkt3_c2s_ack[] = {
* [Time since previous frame in this TCP stream: 0.000565000 seconds]
*/
-unsigned char tcp_pkt4_c2s_fin[] = {
+unsigned char tcp_pkt9_c2s_fin[] = {
0x48, 0x73, 0x97, 0x96, 0x38, 0x0e, 0x3c, 0xa6, 0xf6, 0x0a, 0xc5, 0xea, 0x08, 0x00, 0x45, 0x00, 0x00, 0x34, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06, 0x1d, 0xd8,
0xc0, 0xa8, 0x26, 0x69, 0x5d, 0xb8, 0xd8, 0x22, 0xea, 0xcf, 0x00, 0x50, 0x7c, 0x8c, 0x89, 0x7c, 0x52, 0x57, 0x4f, 0xaa, 0x80, 0x11, 0x08, 0x00, 0xe2, 0x03,
0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x2c, 0x2b, 0x34, 0xd1, 0x48, 0x74, 0x33, 0x31};
@@ -450,13 +1024,94 @@ unsigned char tcp_pkt4_c2s_fin[] = {
* [iRTT: 0.262565000 seconds]
*/
-unsigned char tcp_pkt5_s2c_fin[] = {
+unsigned char tcp_pkt10_s2c_fin[] = {
0x3c, 0xa6, 0xf6, 0x0a, 0xc5, 0xea, 0x48, 0x73, 0x97, 0x96, 0x38, 0x0e, 0x08, 0x00, 0x45, 0x00, 0x00, 0x34, 0xd6, 0xb3, 0x00, 0x00, 0x2a, 0x06, 0x9d, 0x24,
0x5d, 0xb8, 0xd8, 0x22, 0xc0, 0xa8, 0x26, 0x69, 0x00, 0x50, 0xea, 0xcf, 0x52, 0x57, 0x4f, 0xaa, 0x7c, 0x8c, 0x89, 0x7d, 0x80, 0x11, 0x00, 0x80, 0xe8, 0x51,
0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x48, 0x74, 0x34, 0x62, 0x2c, 0x2b, 0x34, 0xd1};
+/*
+ * Frame 11: 66 bytes on wire (528 bits), 66 bytes captured (528 bits) on interface en0, id 0
+ * Ethernet II, Src: Apple_0a:c5:ea (3c:a6:f6:0a:c5:ea), Dst: NewH3CTe_96:38:0e (48:73:97:96:38:0e)
+ * Destination: NewH3CTe_96:38:0e (48:73:97:96:38:0e)
+ * Source: Apple_0a:c5:ea (3c:a6:f6:0a:c5:ea)
+ * Type: IPv4 (0x0800)
+ * Internet Protocol Version 4, Src: 192.168.38.105, Dst: 93.184.216.34
+ * 0100 .... = Version: 4
+ * .... 0101 = Header Length: 20 bytes (5)
+ * Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
+ * 0000 00.. = Differentiated Services Codepoint: Default (0)
+ * .... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
+ * Total Length: 52
+ * Identification: 0x0000 (0)
+ * 010. .... = Flags: 0x2, Don't fragment
+ * 0... .... = Reserved bit: Not set
+ * .1.. .... = Don't fragment: Set
+ * ..0. .... = More fragments: Not set
+ * ...0 0000 0000 0000 = Fragment Offset: 0
+ * Time to Live: 64
+ * Protocol: TCP (6)
+ * Header Checksum: 0x1dd8 [correct]
+ * [Header checksum status: Good]
+ * [Calculated Checksum: 0x1dd8]
+ * Source Address: 192.168.38.105
+ * Destination Address: 93.184.216.34
+ * Transmission Control Protocol, Src Port: 60111, Dst Port: 80, Seq: 81, Ack: 1609, Len: 0
+ * Source Port: 60111
+ * Destination Port: 80
+ * [Stream index: 0]
+ * [Conversation completeness: Complete, WITH_DATA (31)]
+ * [TCP Segment Len: 0]
+ * Sequence Number: 81 (relative sequence number)
+ * Sequence Number (raw): 2089585021
+ * [Next Sequence Number: 81 (relative sequence number)]
+ * Acknowledgment Number: 1609 (relative ack number)
+ * Acknowledgment number (raw): 1381453739
+ * 1000 .... = Header Length: 32 bytes (8)
+ * Flags: 0x010 (ACK)
+ * 000. .... .... = Reserved: Not set
+ * ...0 .... .... = Accurate ECN: Not set
+ * .... 0... .... = Congestion Window Reduced: Not set
+ * .... .0.. .... = ECN-Echo: Not set
+ * .... ..0. .... = Urgent: Not set
+ * .... ...1 .... = Acknowledgment: Set
+ * .... .... 0... = Push: Not set
+ * .... .... .0.. = Reset: Not set
+ * .... .... ..0. = Syn: Not set
+ * .... .... ...0 = Fin: Not set
+ * [TCP Flags: ·······A····]
+ * Window: 2048
+ * [Calculated window size: 131072]
+ * [Window size scaling factor: 64]
+ * Checksum: 0xdf9d [correct]
+ * [Checksum Status: Good]
+ * [Calculated Checksum: 0xdf9d]
+ * Urgent Pointer: 0
+ * Options: (12 bytes), No-Operation (NOP), No-Operation (NOP), Timestamps
+ * TCP Option - No-Operation (NOP)
+ * Kind: No-Operation (1)
+ * TCP Option - No-Operation (NOP)
+ * Kind: No-Operation (1)
+ * TCP Option - Timestamps
+ * Kind: Time Stamp Option (8)
+ * Length: 10
+ * Timestamp value: 741029381: TSval 741029381, TSecr 1215575138
+ * Timestamp echo reply: 1215575138
+ * [Timestamps]
+ * [Time since first frame in this TCP stream: 0.876872000 seconds]
+ * [Time since previous frame in this TCP stream: 0.000304000 seconds]
+ * [SEQ/ACK analysis]
+ * [This is an ACK to the segment in frame: 10]
+ * [The RTT to ACK the segment was: 0.000304000 seconds]
+ * [iRTT: 0.262565000 seconds]
+ */
+
+unsigned char tcp_pkt11_c2s_ack[] = {
+ 0x48, 0x73, 0x97, 0x96, 0x38, 0x0e, 0x3c, 0xa6, 0xf6, 0x0a, 0xc5, 0xea, 0x08, 0x00, 0x45, 0x00, 0x00, 0x34, 0x00, 0x00, 0x40, 0x00, 0x40, 0x06, 0x1d, 0xd8,
+ 0xc0, 0xa8, 0x26, 0x69, 0x5d, 0xb8, 0xd8, 0x22, 0xea, 0xcf, 0x00, 0x50, 0x7c, 0x8c, 0x89, 0x7d, 0x52, 0x57, 0x4f, 0xab, 0x80, 0x10, 0x08, 0x00, 0xdf, 0x9d,
+ 0x00, 0x00, 0x01, 0x01, 0x08, 0x0a, 0x2c, 0x2b, 0x36, 0x05, 0x48, 0x74, 0x34, 0x62};
+
/******************************************************************************
- * test packet UDP
+ * test packet: UDP www.badssl.com
******************************************************************************/
/*
@@ -818,7 +1473,7 @@ unsigned char udp_pkt2_dns_resp[] = {
* plugin
******************************************************************************/
-uint8_t PLUGIN_EX = 0;
+uint8_t plugin_ex = 0;
const char *plugin_ctx = "hello world";
void plugin_session_ex_free(struct session *sess, uint8_t idx, void *ex_ptr, void *arg)
@@ -830,7 +1485,7 @@ void plugin_session_ex_free(struct session *sess, uint8_t idx, void *ex_ptr, voi
void plugin_init(void)
{
- PLUGIN_EX = session_get_ex_new_index("PLUGIN_EX", plugin_session_ex_free, NULL);
+ plugin_ex = session_get_ex_new_index("plugin_ex", plugin_session_ex_free, NULL);
}
void plugin_dispatch(struct session *sess, uint32_t event, void *arg)
@@ -841,11 +1496,11 @@ void plugin_dispatch(struct session *sess, uint32_t event, void *arg)
if (event == SESSION_EVENT_OPENING)
{
char *pluin_ex = strdup("123");
- session_set_ex_data(sess, PLUGIN_EX, pluin_ex);
+ session_set_ex_data(sess, plugin_ex, pluin_ex);
}
else
{
- char *pluin_ex = (char *)session_get0_ex_data(sess, PLUGIN_EX);
+ char *pluin_ex = (char *)session_get0_ex_data(sess, plugin_ex);
EXPECT_STREQ(pluin_ex, "123");
}
printf("<= plugin_dispatch\n");
@@ -853,11 +1508,17 @@ void plugin_dispatch(struct session *sess, uint32_t event, void *arg)
}
/******************************************************************************
- * test case
+ * test case: INIT -> OPENING
******************************************************************************/
#if 1
-TEST(SESSION_MANAGER, INIT_TO_OPENING_BY_TCP_SYN)
+/*
+ * packet: tcp syn packet
+ *
+ * note: the syn packet can trigger a change in session status from INIT to OPENING
+ * only trigger OPENING event
+ */
+TEST(SESSION_MANAGER, INIT_TO_OPENING_BY_SYN)
{
char buffer[1024];
uint64_t max_session_num = 16;
@@ -928,7 +1589,13 @@ TEST(SESSION_MANAGER, INIT_TO_OPENING_BY_TCP_SYN)
#endif
#if 1
-TEST(SESSION_MANAGER, INIT_TO_OPENING_BY_TCP_SYNACK)
+/*
+ * packet: tcp synack packet
+ *
+ * note: the synack packet can trigger a change in session status from INIT to OPENING
+ * only trigger OPENING event
+ */
+TEST(SESSION_MANAGER, INIT_TO_OPENING_BY_SYNACK)
{
char buffer[1024];
uint64_t max_session_num = 16;
@@ -998,7 +1665,17 @@ TEST(SESSION_MANAGER, INIT_TO_OPENING_BY_TCP_SYNACK)
}
#endif
+/******************************************************************************
+ * test case: INIT -> ACTIVE
+ ******************************************************************************/
+
#if 1
+/*
+ * packet: udp c2s packet
+ *
+ * note: the udp c2s packet can trigger a change in session status from INIT to ACTIVE
+ * trigger OPENING and ACTIVE event
+ */
TEST(SESSION_MANAGER, INIT_TO_ACTIVE_BY_UDP_C2S)
{
char buffer[1024];
@@ -1070,6 +1747,12 @@ TEST(SESSION_MANAGER, INIT_TO_ACTIVE_BY_UDP_C2S)
#endif
#if 1
+/*
+ * packet: udp s2c packet
+ *
+ * note: the udp s2c packet can trigger a change in session status from INIT to ACTIVE
+ * trigger OPENING and ACTIVE event
+ */
TEST(SESSION_MANAGER, INIT_TO_ACTIVE_BY_UDP_S2C)
{
char buffer[1024];
@@ -1140,53 +1823,1566 @@ TEST(SESSION_MANAGER, INIT_TO_ACTIVE_BY_UDP_S2C)
}
#endif
-TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_TCP_PAYLOAD)
-{
-}
+/******************************************************************************
+ * test case: OPENING -> ACTIVE
+ ******************************************************************************/
+#if 1
+/*
+ * packet: tcp syn packet && tcp c2s payload packet
+ *
+ *
+ * note: the syn packet can trigger a change in session status from INIT to OPENING
+ * only trigger OPENING event
+ * note: the tcp c2s packet can trigger a change in session status from OPENING to ACTIVE
+ * trigger OPENING and ACTIVE event
+ */
+TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYN_AND_C2S_PAYLOAD)
+{
+ char buffer[1024];
+ uint64_t max_session_num = 16;
+ struct packet pkt;
+ struct session *sess = NULL;
+ struct session_manager *mgr = NULL;
+
+ timestamp_update();
+ plugin_init();
+
+ mgr = session_manager_create(max_session_num);
+ EXPECT_TRUE(mgr != NULL);
+ session_manager_set_session_eventcb(mgr, plugin_dispatch, (void *)plugin_ctx);
+ session_manager_set_packet_timeout(mgr, 1000);
+ session_manager_set_closing_timeout(mgr, 2000);
+
+ /**************************************************************************
+ * syn packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt1_c2s_syn, sizeof(tcp_pkt1_c2s_syn));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_OPENING);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 0);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 0);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == TCP_SYN_RECVED);
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer SYN Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * c2s payload packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt4_c2s_http_req, sizeof(tcp_pkt4_c2s_http_req));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_ACTIVE);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78 + 145);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 0);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 0);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_C2S_PAYLOAD_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer C2S Payload Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ /**************************************************************************
+ * timeout
+ **************************************************************************/
+
+ printf("\n===> Atfer timeout <=== \n\n");
+ for (int i = 0; i < 4; i++)
+ {
+ timestamp_update();
+ session_manager_dispatch(mgr);
+ sleep(1);
+ }
+
+ // check sess mgr
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ // destory
+ session_manager_destroy(mgr);
+}
+#endif
+
+#if 1
+/*
+ * packet: tcp syn packet && tcp s2c payload packet
+ *
+ *
+ * note: the syn packet can trigger a change in session status from INIT to OPENING
+ * only trigger OPENING event
+ * note: the tcp s2c packet can trigger a change in session status from OPENING to ACTIVE
+ * trigger OPENING and ACTIVE event
+ */
+TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYN_AND_S2C_PAYLOAD)
+{
+ char buffer[1024];
+ uint64_t max_session_num = 16;
+ struct packet pkt;
+ struct session *sess = NULL;
+ struct session_manager *mgr = NULL;
+
+ timestamp_update();
+ plugin_init();
+
+ mgr = session_manager_create(max_session_num);
+ EXPECT_TRUE(mgr != NULL);
+ session_manager_set_session_eventcb(mgr, plugin_dispatch, (void *)plugin_ctx);
+ session_manager_set_packet_timeout(mgr, 1000);
+ session_manager_set_closing_timeout(mgr, 2000);
+
+ /**************************************************************************
+ * syn packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt1_c2s_syn, sizeof(tcp_pkt1_c2s_syn));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_OPENING);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 0);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 0);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == TCP_SYN_RECVED);
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer SYN Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * s2c payload packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt6_s2c_http_resq_1, sizeof(tcp_pkt6_s2c_http_resq_1));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_ACTIVE);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 1354);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_S2C_PAYLOAD_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer C2S Payload Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ /**************************************************************************
+ * timeout
+ **************************************************************************/
+
+ printf("\n===> Atfer timeout <=== \n\n");
+ for (int i = 0; i < 4; i++)
+ {
+ timestamp_update();
+ session_manager_dispatch(mgr);
+ sleep(1);
+ }
+
+ // check sess mgr
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ // destory
+ session_manager_destroy(mgr);
+}
+#endif
+
+#if 1
+/*
+ * packet: tcp synack packet && tcp c2s payload packet
+ *
+ * note: the synack packet can trigger a change in session status from INIT to OPENING
+ * only trigger OPENING event
+ * note: the tcp c2s packet can trigger a change in session status from OPENING to ACTIVE
+ * trigger OPENING and ACTIVE event
+ */
+TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYNACK_AND_C2S_PAYLOAD)
+{
+ char buffer[1024];
+ uint64_t max_session_num = 16;
+ struct packet pkt;
+ struct session *sess = NULL;
+ struct session_manager *mgr = NULL;
+
+ timestamp_update();
+ plugin_init();
+
+ mgr = session_manager_create(max_session_num);
+ EXPECT_TRUE(mgr != NULL);
+ session_manager_set_session_eventcb(mgr, plugin_dispatch, (void *)plugin_ctx);
+ session_manager_set_packet_timeout(mgr, 1000);
+ session_manager_set_closing_timeout(mgr, 2000);
+
+ /**************************************************************************
+ * synack packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt2_s2c_syn_ack, sizeof(tcp_pkt2_s2c_syn_ack));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "93.184.216.34:80 -> 192.168.38.105:60111, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_S2C);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_OPENING);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 0);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 0);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == TCP_SYNACK_RECVED);
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer SYNACK Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * c2s payload packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt4_c2s_http_req, sizeof(tcp_pkt4_c2s_http_req));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "93.184.216.34:80 -> 192.168.38.105:60111, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_S2C);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_ACTIVE);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 145);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer C2S Payload Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ /**************************************************************************
+ * timeout
+ **************************************************************************/
+
+ printf("\n===> Atfer timeout <=== \n\n");
+ for (int i = 0; i < 4; i++)
+ {
+ timestamp_update();
+ session_manager_dispatch(mgr);
+ sleep(1);
+ }
+
+ // check sess mgr
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ // destory
+ session_manager_destroy(mgr);
+}
+#endif
+
+#if 1
+/*
+ * packet: tcp synack packet && tcp s2c payload packet
+ *
+ * note: the synack packet can trigger a change in session status from INIT to OPENING
+ * only trigger OPENING event
+ * note: the tcp s2c packet can trigger a change in session status from OPENING to ACTIVE
+ * trigger OPENING and ACTIVE event
+ */
+TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYNACK_AND_S2C_PAYLOAD)
+{
+ char buffer[1024];
+ uint64_t max_session_num = 16;
+ struct packet pkt;
+ struct session *sess = NULL;
+ struct session_manager *mgr = NULL;
+
+ timestamp_update();
+ plugin_init();
+
+ mgr = session_manager_create(max_session_num);
+ EXPECT_TRUE(mgr != NULL);
+ session_manager_set_session_eventcb(mgr, plugin_dispatch, (void *)plugin_ctx);
+ session_manager_set_packet_timeout(mgr, 1000);
+ session_manager_set_closing_timeout(mgr, 2000);
+
+ /**************************************************************************
+ * synack packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt2_s2c_syn_ack, sizeof(tcp_pkt2_s2c_syn_ack));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "93.184.216.34:80 -> 192.168.38.105:60111, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_S2C);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_OPENING);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 0);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 0);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == TCP_SYNACK_RECVED);
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer SYNACK Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * s2c payload packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt6_s2c_http_resq_1, sizeof(tcp_pkt6_s2c_http_resq_1));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "93.184.216.34:80 -> 192.168.38.105:60111, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_S2C);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_ACTIVE);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 0);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 1354);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 0);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYNACK_RECVED | TCP_S2C_PAYLOAD_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer S2C Payload Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ /**************************************************************************
+ * timeout
+ **************************************************************************/
+
+ printf("\n===> Atfer timeout <=== \n\n");
+ for (int i = 0; i < 4; i++)
+ {
+ timestamp_update();
+ session_manager_dispatch(mgr);
+ sleep(1);
+ }
+
+ // check sess mgr
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ // destory
+ session_manager_destroy(mgr);
+}
+#endif
+
+#if 1
+/*
+ * packet: tcp syn packet && tcp synack packet && tcp ack packet && tcp c2s payload packet
+ *
+ * note: the syn packet can trigger a change in session status from INIT to OPENING
+ * only trigger OPENING event
+ * note: the synack packet still keep session status OPENING
+ * will not trigger OPENING event
+ * note: the ack packet still keep session status OPENING
+ * will not trigger OPENING event
+ * note: the tcp c2s packet can trigger a change in session status from OPENING to ACTIVE
+ * trigger ACTIVE event
+ */
+// SYN && SYNACK && ACK && C2S PAYLOAY
+TEST(SESSION_MANAGER, OPENING_TO_ACTIVE_BY_SYN_AND_SYNACK_AND_ACK_AND_C2S_PAYLOAD)
+{
+ char buffer[1024];
+ uint64_t max_session_num = 16;
+ struct packet pkt;
+ struct session *sess = NULL;
+ struct session_manager *mgr = NULL;
+
+ timestamp_update();
+ plugin_init();
+
+ mgr = session_manager_create(max_session_num);
+ EXPECT_TRUE(mgr != NULL);
+ session_manager_set_session_eventcb(mgr, plugin_dispatch, (void *)plugin_ctx);
+ session_manager_set_packet_timeout(mgr, 1000);
+ session_manager_set_closing_timeout(mgr, 2000);
+
+ /**************************************************************************
+ * syn packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt1_c2s_syn, sizeof(tcp_pkt1_c2s_syn));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_OPENING);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 0);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 0);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == TCP_SYN_RECVED);
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer SYN Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * synack packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt2_s2c_syn_ack, sizeof(tcp_pkt2_s2c_syn_ack));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_OPENING);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer SYNACK Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * ack packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt3_c2s_ack, sizeof(tcp_pkt3_c2s_ack));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_OPENING);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78 + 66);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer ACK Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * c2s payload packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt4_c2s_http_req, sizeof(tcp_pkt4_c2s_http_req));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_ACTIVE);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78 + 66 + 145);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer C2S TCP Payload Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ /**************************************************************************
+ * timeout
+ **************************************************************************/
+
+ printf("\n===> Atfer timeout <=== \n\n");
+ for (int i = 0; i < 4; i++)
+ {
+ timestamp_update();
+ session_manager_dispatch(mgr);
+ sleep(1);
+ }
+
+ // check sess mgr
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ // destory
+ session_manager_destroy(mgr);
+}
+#endif
+
+/******************************************************************************
+ * test case: ACTIVE -> CLOSING
+ ******************************************************************************/
+
+#if 1
TEST(SESSION_MANAGER, ACTIVE_TO_CLOSING_BY_2_TCP_FINS)
{
+ // have test on TCP_FULL_STREAM
}
+#endif
-TEST(SESSION_MANAGER, ACTIVE_TO_CLOSING_BY_TCP_RST)
+TEST(SESSION_MANAGER, ACTIVE_TO_CLOSING_BY_TCP_C2S_RST)
{
+ // TODO
}
+TEST(SESSION_MANAGER, ACTIVE_TO_CLOSING_BY_TCP_S2C_RST)
+{
+ // TODO
+}
+
+#if 1
TEST(SESSION_MANAGER, ACTIVE_TO_CLOSING_BY_TCP_TIMEOUT)
{
+ // have test on above(when timeout)
}
+#endif
+#if 1
TEST(SESSION_MANAGER, ACTIVE_TO_CLOSING_BY_UDP_TIMEOUT)
{
+ // have test on INIT_TO_ACTIVE_BY_UDP_C2S or INIT_TO_ACTIVE_BY_UDP_S2C
}
+#endif
+/******************************************************************************
+ * test case: OPENING -> CLOSING
+ ******************************************************************************/
+
+#if 1
TEST(SESSION_MANAGER, OPENING_TO_CLOSING_BY_TCP_TIMEOUT)
{
+ // have test on INIT_TO_OPENING_BY_SYN or INIT_TO_OPENING_BY_SYNACK
}
+#endif
-TEST(SESSION_MANAGER, OPENING_TO_CLOSING_BY_UDP_TIMEOUT)
-{
-}
+/******************************************************************************
+ * test case: CLOSING -> CLOSED
+ ******************************************************************************/
+#if 1
TEST(SESSION_MANAGER, CLOSING_TO_CLOSED_BY_TCP_TIMEOUT)
{
+ // have test on above(when timeout)
}
+#endif
+#if 1
TEST(SESSION_MANAGER, CLOSING_TO_CLOSED_BY_UDP_TIMEOUT)
{
+ // have test on above(when timeout)
}
+#endif
+
+/******************************************************************************
+ * test case: other
+ ******************************************************************************/
TEST(SESSION_MANAGER, TABLE_FULL_DISCARD)
{
+ // TODO
}
+#if 1
+/*
+ * packet: tcp syn packet
+ * tcp synack packet
+ * tcp ack packet
+ * tcp c2s http req packet
+ * tcp s2c ack packet
+ * tcp s2c http resq packet1
+ * tcp s2c http resq packet2
+ * tcp c2s ack packet
+ * tcp c2s fin packet
+ * tcp s2c fin packet
+ * tcp c2s ack packet
+ *
+ * note: the syn packet can trigger a change in session status from INIT to OPENING
+ * trigger OPENING event
+ * note: the synack packet still keep session status OPENING
+ * will not trigger event
+ * note: the ack packet still keep session status OPENING
+ * will not trigger event
+ * note: the tcp c2s http req packet can trigger a change in session status from OPENING to ACTIVE
+ * trigger ACTIVE event
+ * note: the tcp s2c ack packet still keep session status ACTIVE
+ * trigger ACTIVE event
+ * note: the tcp s2c http resq packet1 still keep session status ACTIVE
+ * trigger ACTIVE event
+ * note: the tcp s2c http resq packet2 still keep session status ACTIVE
+ * trigger ACTIVE event
+ * note: the tcp c2s ack packet still keep session status ACTIVE
+ * trigger ACTIVE event
+ * note: the tcp c2s fin packet still keep session status ACTIVE
+ * trigger ACTIVE event
+ * note: the tcp s2c fin packet can trigger a change in session status from ACTIVE to CLOSING
+ * trigger CLOSING event
+ * note: the tcp c2s ack packet still keep session status CLOSING
+ * will not trigger event
+ */
TEST(SESSION_MANAGER, TCP_FULL_STREAM)
{
-}
+ char buffer[1024];
+ uint64_t max_session_num = 16;
+ struct packet pkt;
+ struct session *sess = NULL;
+ struct session_manager *mgr = NULL;
+ timestamp_update();
+ plugin_init();
+
+ mgr = session_manager_create(max_session_num);
+ EXPECT_TRUE(mgr != NULL);
+ session_manager_set_session_eventcb(mgr, plugin_dispatch, (void *)plugin_ctx);
+ session_manager_set_packet_timeout(mgr, 1000);
+ session_manager_set_closing_timeout(mgr, 2000);
+
+ /**************************************************************************
+ * syn packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt1_c2s_syn, sizeof(tcp_pkt1_c2s_syn));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_OPENING);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 0);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 0);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == TCP_SYN_RECVED);
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer SYN Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * synack packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt2_s2c_syn_ack, sizeof(tcp_pkt2_s2c_syn_ack));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_OPENING);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer SYNACK Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * ack packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt3_c2s_ack, sizeof(tcp_pkt3_c2s_ack));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_OPENING);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78 + 66);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer ACK Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * c2s http req packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt4_c2s_http_req, sizeof(tcp_pkt4_c2s_http_req));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_ACTIVE);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78 + 66 + 145);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer C2S HTTP Req Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * s2c ack packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt5_s2c_ack, sizeof(tcp_pkt5_s2c_ack));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_ACTIVE);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78 + 66 + 145);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 66);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer S2C Ack Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * s2c http resp packet1
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt6_s2c_http_resq_1, sizeof(tcp_pkt6_s2c_http_resq_1));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_ACTIVE);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78 + 66 + 145);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 66 + 1354);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1 + 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED | TCP_S2C_PAYLOAD_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer S2C HTTP Resp Packet1 <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * s2c http resp packet2
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt7_s2c_http_resp_2, sizeof(tcp_pkt7_s2c_http_resp_2));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_ACTIVE);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78 + 66 + 145);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 66 + 1354 + 385);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1 + 1 + 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED | TCP_S2C_PAYLOAD_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer S2C HTTP Resp Packet2 <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * c2s ack packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt8_c2s_ack, sizeof(tcp_pkt8_c2s_ack));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_ACTIVE);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78 + 66 + 145 + 66);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 66 + 1354 + 385);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1 + 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1 + 1 + 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED | TCP_S2C_PAYLOAD_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer C2S Ack Packet2 <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * c2s fin packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt9_c2s_fin, sizeof(tcp_pkt9_c2s_fin));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_ACTIVE);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78 + 66 + 145 + 66 + 66);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 66 + 1354 + 385);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1 + 1 + 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1 + 1 + 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED | TCP_S2C_PAYLOAD_RECVED | TCP_C2S_FIN_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer C2S FIN Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * s2c fin packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt10_s2c_fin, sizeof(tcp_pkt10_s2c_fin));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_CLOSING);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78 + 66 + 145 + 66 + 66);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 66 + 1354 + 385 + 66);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1 + 1 + 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1 + 1 + 1 + 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED | TCP_S2C_PAYLOAD_RECVED | TCP_C2S_FIN_RECVED | TCP_S2C_FIN_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ timestamp_update();
+ printf("\n===> Atfer C2S FIN Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * c2s ack packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)tcp_pkt11_c2s_ack, sizeof(tcp_pkt11_c2s_ack));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:60111 -> 93.184.216.34:80, proto: 6, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_CLOSING);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_TCP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 78 + 66 + 145 + 66 + 66);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 74 + 66 + 1354 + 385 + 66);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1 + 1 + 1 + 1 + 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1 + 1 + 1 + 1 + 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == NULL);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_NONE);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, tcp_builtin_ex) == (TCP_SYN_RECVED | TCP_SYNACK_RECVED | TCP_C2S_PAYLOAD_RECVED | TCP_S2C_PAYLOAD_RECVED | TCP_C2S_FIN_RECVED | TCP_S2C_FIN_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 1);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ /**************************************************************************
+ * timeout
+ **************************************************************************/
+
+ printf("\n===> Atfer timeout <=== \n\n");
+ for (int i = 0; i < 4; i++)
+ {
+ timestamp_update();
+ session_manager_dispatch(mgr);
+ sleep(1);
+ }
+
+ // check sess mgr
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ // destory
+ session_manager_destroy(mgr);
+}
+#endif
+
+#if 1
+/*
+ * packet: udp c2s packet & udp s2c packet
+ *
+ * note: the udp c2s packet can trigger a change in session status from INIT to ACTIVE
+ * trigger OPENING and ACTIVE event
+ * note: the udp s2c packet keep the session status in ACTIVE
+ * trigger ACTIVE event
+ */
TEST(SESSION_MANAGER, UDP_FULL_STREAM)
{
+ char buffer[1024];
+ uint64_t max_session_num = 16;
+ struct packet pkt;
+ struct session *sess = NULL;
+ struct session_manager *mgr = NULL;
+
+ timestamp_update();
+ plugin_init();
+
+ mgr = session_manager_create(max_session_num);
+ EXPECT_TRUE(mgr != NULL);
+ session_manager_set_session_eventcb(mgr, plugin_dispatch, (void *)plugin_ctx);
+ session_manager_set_packet_timeout(mgr, 1000);
+ session_manager_set_closing_timeout(mgr, 2000);
+
+ /**************************************************************************
+ * UDP c2s packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)udp_pkt1_dns_req, sizeof(udp_pkt1_dns_req));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:61099 -> 121.14.154.93:53, proto: 17, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_ACTIVE);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_UDP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 74);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 0);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 0);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) == session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, udp_builtin_ex) == UDP_C2S_RECVED);
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 1);
+
+ timestamp_update();
+ printf("\n===> Atfer UDP c2s Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ // update timestamp
+ usleep(1000);
+ timestamp_update();
+
+ /**************************************************************************
+ * UDP s2c packet
+ **************************************************************************/
+
+ packet_parse(&pkt, (const char *)udp_pkt2_dns_resp, sizeof(udp_pkt2_dns_resp));
+ sess = session_manager_find_session(mgr, &pkt);
+ EXPECT_TRUE(sess);
+
+ // check session info
+ EXPECT_TRUE(session_get_id(sess) == 0);
+ memset(buffer, 0, sizeof(buffer));
+ tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
+ EXPECT_STREQ(buffer, "192.168.38.105:61099 -> 121.14.154.93:53, proto: 17, zone: 0");
+ EXPECT_TRUE(session_get_tuple6_dir(sess) == SESSION_DIR_C2S);
+ EXPECT_TRUE(session_get_state(sess) == SESSION_STATE_ACTIVE);
+ EXPECT_TRUE(session_get_type(sess) == SESSION_TYPE_UDP);
+ EXPECT_TRUE(session_get_c2s_bytes(sess) == 74);
+ EXPECT_TRUE(session_get_s2c_bytes(sess) == 550);
+ EXPECT_TRUE(session_get_c2s_packets(sess) == 1);
+ EXPECT_TRUE(session_get_s2c_packets(sess) == 1);
+ EXPECT_TRUE(session_get0_c2s_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get0_s2c_1st_md(sess) == NULL);
+ EXPECT_TRUE(session_get_create_time(sess) != 0);
+ EXPECT_TRUE(session_get_last_time(sess) != 0);
+ EXPECT_TRUE(session_get_create_time(sess) < session_get_last_time(sess));
+ EXPECT_TRUE(session_get0_cur_pkt(sess) == &pkt);
+ EXPECT_TRUE(session_get_cur_dir(sess) == SESSION_DIR_S2C);
+ EXPECT_TRUE((uint64_t)session_get0_ex_data(sess, udp_builtin_ex) == (UDP_C2S_RECVED | UDP_S2C_RECVED));
+
+ // check session manager info
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 1);
+
+ timestamp_update();
+ printf("\n===> Atfer UDP c2s Packet <=== \n\n");
+ session_manager_dispatch(mgr);
+
+ /**************************************************************************
+ * timeout
+ **************************************************************************/
+
+ for (int i = 0; i < 4; i++)
+ {
+ timestamp_update();
+ session_manager_dispatch(mgr);
+ sleep(1);
+ }
+
+ // check sess mgr
+ EXPECT_TRUE(session_manager_get_tcp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_tcp_active_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_opening_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_closing_sess_num(mgr) == 0);
+ EXPECT_TRUE(session_manager_get_udp_active_sess_num(mgr) == 0);
+
+ // destory
+ session_manager_destroy(mgr);
}
+#endif
// opening -> closing : self protect
// opening -> closed
diff --git a/src/session/session.cpp b/src/session/session.cpp
index 248ef25..8cdfcc6 100644
--- a/src/session/session.cpp
+++ b/src/session/session.cpp
@@ -393,47 +393,42 @@ static void tcp_ex_data_tostring(uint64_t ex_data, char *buffer, size_t buffer_l
int nused = 0;
if (ex_data & TCP_SYN_RECVED)
{
- snprintf(buffer + nused, buffer_len - nused, "TCP_SYN_RECVED ");
+ nused += snprintf(buffer + nused, buffer_len - nused, "TCP_SYN_RECVED ");
}
if (ex_data & TCP_SYNACK_RECVED)
{
- snprintf(buffer + nused, buffer_len - nused, "TCP_SYNACK_RECVED ");
- }
-
- if (ex_data & TCP_ACK_RECVED)
- {
- snprintf(buffer + nused, buffer_len - nused, "TCP_ACK_RECVED ");
+ nused += snprintf(buffer + nused, buffer_len - nused, "TCP_SYNACK_RECVED ");
}
if (ex_data & TCP_C2S_PAYLOAD_RECVED)
{
- snprintf(buffer + nused, buffer_len - nused, "TCP_C2S_PAYLOAD_RECVED ");
+ nused += snprintf(buffer + nused, buffer_len - nused, "TCP_C2S_PAYLOAD_RECVED ");
}
if (ex_data & TCP_S2C_PAYLOAD_RECVED)
{
- snprintf(buffer + nused, buffer_len - nused, "TCP_S2C_PAYLOAD_RECVED ");
+ nused += snprintf(buffer + nused, buffer_len - nused, "TCP_S2C_PAYLOAD_RECVED ");
}
if (ex_data & TCP_C2S_FIN_RECVED)
{
- snprintf(buffer + nused, buffer_len - nused, "TCP_C2S_FIN_RECVED ");
+ nused += snprintf(buffer + nused, buffer_len - nused, "TCP_C2S_FIN_RECVED ");
}
if (ex_data & TCP_S2C_FIN_RECVED)
{
- snprintf(buffer + nused, buffer_len - nused, "TCP_S2C_FIN_RECVED ");
+ nused += snprintf(buffer + nused, buffer_len - nused, "TCP_S2C_FIN_RECVED ");
}
if (ex_data & TCP_C2S_RST_RECVED)
{
- snprintf(buffer + nused, buffer_len - nused, "TCP_C2S_RST_RECVED ");
+ nused += snprintf(buffer + nused, buffer_len - nused, "TCP_C2S_RST_RECVED ");
}
if (ex_data & TCP_S2C_RST_RECVED)
{
- snprintf(buffer + nused, buffer_len - nused, "TCP_S2C_RST_RECVED ");
+ nused += snprintf(buffer + nused, buffer_len - nused, "TCP_S2C_RST_RECVED ");
}
}
@@ -531,21 +526,21 @@ void session_dump(struct session *sess)
char buffer[128] = {0};
tuple6_tostring(session_get0_tuple6(sess), buffer, sizeof(buffer));
- printf("session id : %" PRIu64 "\n", session_get_id(sess));
- printf("session tuple6 : %s\n", buffer);
- printf("session tuple6 dir : %s\n", session_dir_tostring(session_get_tuple6_dir(sess)));
- printf("session state : %s\n", session_state_tostring(session_get_state(sess)));
- printf("session type : %s\n", session_type_tostring(session_get_type(sess)));
- printf("session c2s packets : %" PRIu64 "\n", session_get_c2s_packets(sess));
- printf("session c2s bytes : %" PRIu64 "\n", session_get_c2s_bytes(sess));
- printf("session s2c packets : %" PRIu64 "\n", session_get_s2c_packets(sess));
- printf("session s2c bytes : %" PRIu64 "\n", session_get_s2c_bytes(sess));
- printf("session c2s 1st metadata : %p\n", (void *)session_get0_c2s_1st_md(sess));
- printf("session s2c 1st metadata : %p\n", (void *)session_get0_s2c_1st_md(sess));
- printf("session create time : %" PRIu64 "\n", session_get_create_time(sess));
- printf("session last time : %" PRIu64 "\n", session_get_last_time(sess));
- printf("session current packet : %p\n", (void *)session_get0_cur_pkt(sess));
- printf("session current dir : %s\n", session_dir_tostring(session_get_cur_dir(sess)));
+ printf("session id : %" PRIu64 "\n", session_get_id(sess));
+ printf("session tuple6 key : %s\n", buffer);
+ printf("session tuple6 dir : %s\n", session_dir_tostring(session_get_tuple6_dir(sess)));
+ printf("session state : %s\n", session_state_tostring(session_get_state(sess)));
+ printf("session type : %s\n", session_type_tostring(session_get_type(sess)));
+ printf("session c2s packets : %" PRIu64 "\n", session_get_c2s_packets(sess));
+ printf("session c2s bytes : %" PRIu64 "\n", session_get_c2s_bytes(sess));
+ printf("session s2c packets : %" PRIu64 "\n", session_get_s2c_packets(sess));
+ printf("session s2c bytes : %" PRIu64 "\n", session_get_s2c_bytes(sess));
+ printf("session c2s 1st metadata : %p\n", (void *)session_get0_c2s_1st_md(sess));
+ printf("session s2c 1st metadata : %p\n", (void *)session_get0_s2c_1st_md(sess));
+ printf("session create time : %" PRIu64 "\n", session_get_create_time(sess));
+ printf("session last time : %" PRIu64 "\n", session_get_last_time(sess));
+ printf("session current packet ptr : %p\n", (void *)session_get0_cur_pkt(sess));
+ printf("session current packet dir : %s\n", session_dir_tostring(session_get_cur_dir(sess)));
printf("session ex data: \n");
for (uint8_t i = 0; i < g_ex_manager.count; i++)
{
diff --git a/src/session/session_manager.cpp b/src/session/session_manager.cpp
index 336c877..6baa2c7 100644
--- a/src/session/session_manager.cpp
+++ b/src/session/session_manager.cpp
@@ -296,11 +296,13 @@ static void update_tcp_ex_data(struct session *sess, const struct packet *pkt, e
{
if (curr_dir == SESSION_DIR_C2S)
{
- session_set_ex_data(sess, tcp_builtin_ex, (void *)(state & TCP_C2S_RST_RECVED));
+ state |= TCP_C2S_RST_RECVED;
+ session_set_ex_data(sess, tcp_builtin_ex, (void *)(state));
}
else
{
- session_set_ex_data(sess, tcp_builtin_ex, (void *)(state & TCP_S2C_RST_RECVED));
+ state |= TCP_S2C_RST_RECVED;
+ session_set_ex_data(sess, tcp_builtin_ex, (void *)(state));
}
}
@@ -308,11 +310,13 @@ static void update_tcp_ex_data(struct session *sess, const struct packet *pkt, e
{
if (curr_dir == SESSION_DIR_C2S)
{
- session_set_ex_data(sess, tcp_builtin_ex, (void *)(state & TCP_C2S_FIN_RECVED));
+ state |= TCP_C2S_FIN_RECVED;
+ session_set_ex_data(sess, tcp_builtin_ex, (void *)(state));
}
else
{
- session_set_ex_data(sess, tcp_builtin_ex, (void *)(state & TCP_S2C_FIN_RECVED));
+ state |= TCP_S2C_FIN_RECVED;
+ session_set_ex_data(sess, tcp_builtin_ex, (void *)(state));
}
}
@@ -320,28 +324,27 @@ static void update_tcp_ex_data(struct session *sess, const struct packet *pkt, e
{
if (packet_has_tcp_flag_ack(pkt))
{
- session_set_ex_data(sess, tcp_builtin_ex, (void *)(state | TCP_SYNACK_RECVED));
+ state |= TCP_SYNACK_RECVED;
+ session_set_ex_data(sess, tcp_builtin_ex, (void *)(state));
}
else
{
- session_set_ex_data(sess, tcp_builtin_ex, (void *)(state | TCP_SYN_RECVED));
+ state |= TCP_SYN_RECVED;
+ session_set_ex_data(sess, tcp_builtin_ex, (void *)(state));
}
}
- if (packet_has_tcp_flag_ack(pkt) && curr_dir == SESSION_DIR_C2S)
- {
- session_set_ex_data(sess, tcp_builtin_ex, (void *)(state | TCP_ACK_RECVED));
- }
-
if (packet_get_tcp_pld_len(pkt) > 0)
{
if (curr_dir == SESSION_DIR_C2S)
{
- session_set_ex_data(sess, tcp_builtin_ex, (void *)(state | TCP_C2S_PAYLOAD_RECVED));
+ state |= TCP_C2S_PAYLOAD_RECVED;
+ session_set_ex_data(sess, tcp_builtin_ex, (void *)(state));
}
else
{
- session_set_ex_data(sess, tcp_builtin_ex, (void *)(state | TCP_S2C_PAYLOAD_RECVED));
+ state |= TCP_S2C_PAYLOAD_RECVED;
+ session_set_ex_data(sess, tcp_builtin_ex, (void *)(state));
}
}
}
diff --git a/src/session/session_private.h b/src/session/session_private.h
index 5d565aa..73436b8 100644
--- a/src/session/session_private.h
+++ b/src/session/session_private.h
@@ -22,16 +22,15 @@ enum tcp_ex_data
// HANDSHAKE
TCP_SYN_RECVED = 1 << 0,
TCP_SYNACK_RECVED = 1 << 1,
- TCP_ACK_RECVED = 1 << 2,
// ESTABLISHED
- TCP_C2S_PAYLOAD_RECVED = 1 << 3,
- TCP_S2C_PAYLOAD_RECVED = 1 << 4,
+ TCP_C2S_PAYLOAD_RECVED = 1 << 2,
+ TCP_S2C_PAYLOAD_RECVED = 1 << 3,
// FIN
- TCP_C2S_FIN_RECVED = 1 << 5,
- TCP_S2C_FIN_RECVED = 1 << 6,
+ TCP_C2S_FIN_RECVED = 1 << 4,
+ TCP_S2C_FIN_RECVED = 1 << 5,
// RST
- TCP_C2S_RST_RECVED = 1 << 7,
- TCP_S2C_RST_RECVED = 1 << 8,
+ TCP_C2S_RST_RECVED = 1 << 6,
+ TCP_S2C_RST_RECVED = 1 << 7,
};
enum udp_ex_data