18 #include "../suricata-common.h"
19 #include "../stream-tcp-private.h"
20 #include "../stream-tcp.h"
21 #include "../stream-tcp-reassemble.h"
22 #include "../stream-tcp-inline.h"
23 #include "../stream-tcp-list.h"
24 #include "../stream-tcp-util.h"
25 #include "../util-streaming-buffer.h"
26 #include "../util-print.h"
27 #include "../util-unittest.h"
29 #define SET_ISN(stream, setseq) \
30 (stream)->isn = (setseq); \
31 (stream)->base_seq = (setseq) + 1
40 static int StreamTcpTest01(
void)
46 memset(&f, 0,
sizeof(
Flow));
50 TcpSession *ssn = StreamTcpNewSession(NULL, &stt, p, 0);
70 static int StreamTcpTest02(
void)
80 memset(&pq, 0,
sizeof(pq));
81 memset(&f, 0,
sizeof(
Flow));
84 memset(&tcph, 0,
sizeof(TCPHdr));
88 tcph.th_win = htons(5480);
97 p->
tcph->th_ack = htonl(1);
103 p->
tcph->th_ack = htonl(1);
104 p->
tcph->th_seq = htonl(1);
110 p->
tcph->th_ack = htonl(1);
111 p->
tcph->th_seq = htonl(2);
124 p->
tcph->th_ack = htonl(1);
125 p->
tcph->th_seq = htonl(6);
155 static int StreamTcpTest03(
void)
164 memset(&pq, 0,
sizeof(pq));
165 memset(&f, 0,
sizeof(
Flow));
168 memset(&tcph, 0,
sizeof(TCPHdr));
174 tcph.th_win = htons(5480);
175 tcph.th_seq = htonl(10);
176 tcph.th_ack = htonl(20);
184 p->
tcph->th_seq = htonl(20);
185 p->
tcph->th_ack = htonl(11);
192 p->
tcph->th_seq = htonl(19);
193 p->
tcph->th_ack = htonl(11);
229 static int StreamTcpTest04(
void)
238 memset(&pq, 0,
sizeof(pq));
239 memset(&f, 0,
sizeof(
Flow));
242 memset(&tcph, 0,
sizeof(TCPHdr));
248 tcph.th_win = htons(5480);
249 tcph.th_seq = htonl(10);
250 tcph.th_ack = htonl(20);
259 p->
tcph->th_seq = htonl(9);
260 p->
tcph->th_ack = htonl(19);
296 static int StreamTcpTest05(
void)
307 memset(&f, 0,
sizeof(
Flow));
310 memset(&tcph, 0,
sizeof(TCPHdr));
316 tcph.th_win = htons(5480);
317 tcph.th_seq = htonl(10);
318 tcph.th_ack = htonl(20);
329 p->
tcph->th_seq = htonl(20);
330 p->
tcph->th_ack = htonl(13);
341 p->
tcph->th_seq = htonl(13);
342 p->
tcph->th_ack = htonl(23);
353 p->
tcph->th_seq = htonl(19);
354 p->
tcph->th_ack = htonl(16);
394 static int StreamTcpTest06(
void)
405 memset(&f, 0,
sizeof(
Flow));
409 memset(&tcph, 0,
sizeof(TCPHdr));
421 printf(
"StreamTcpPacket failed: ");
426 printf(
"we have a ssn while we shouldn't: ");
433 printf(
"StreamTcpPacket failed (2): ");
438 printf(
"we have a ssn while we shouldn't (2): ");
455 static int StreamTcpTest07(
void)
463 uint8_t payload[1] = { 0x42 };
467 memset(&f, 0,
sizeof(
Flow));
470 memset(&tcph, 0,
sizeof(TCPHdr));
478 tcph.th_win = htons(5480);
479 tcph.th_seq = htonl(10);
480 tcph.th_ack = htonl(20);
493 p->
tcph->th_seq = htonl(11);
494 p->
tcph->th_ack = htonl(23);
516 static int StreamTcpTest08(
void)
524 uint8_t payload[1] = { 0x42 };
528 memset(&f, 0,
sizeof(
Flow));
531 memset(&tcph, 0,
sizeof(TCPHdr));
539 tcph.th_win = htons(5480);
540 tcph.th_seq = htonl(10);
541 tcph.th_ack = htonl(20);
554 p->
tcph->th_seq = htonl(11);
555 p->
tcph->th_ack = htonl(20);
578 static int StreamTcpTest09(
void)
586 uint8_t payload[1] = { 0x42 };
590 memset(&f, 0,
sizeof(
Flow));
593 memset(&tcph, 0,
sizeof(TCPHdr));
601 tcph.th_win = htons(5480);
602 tcph.th_seq = htonl(10);
603 tcph.th_ack = htonl(20);
612 p->
tcph->th_seq = htonl(12);
613 p->
tcph->th_ack = htonl(23);
623 p->
tcph->th_seq = htonl(11);
624 p->
tcph->th_ack = htonl(23);
634 FAIL_IF(TCPSEG_RB_NEXT(seg) != NULL);
648 static int StreamTcpTest10(
void)
659 memset(&f, 0,
sizeof(
Flow));
662 memset(&tcph, 0,
sizeof(TCPHdr));
669 tcph.th_win = htons(5480);
670 tcph.th_seq = htonl(10);
677 p->
tcph->th_seq = htonl(11);
678 p->
tcph->th_ack = htonl(11);
684 p->
tcph->th_seq = htonl(11);
685 p->
tcph->th_ack = htonl(11);
695 p->
tcph->th_seq = htonl(6);
696 p->
tcph->th_ack = htonl(11);
727 static int StreamTcpTest11(
void)
738 memset(&f, 0,
sizeof(
Flow));
741 memset(&tcph, 0,
sizeof(TCPHdr));
748 tcph.th_win = htons(5480);
749 tcph.th_seq = htonl(10);
750 tcph.th_ack = htonl(1);
756 p->
tcph->th_seq = htonl(11);
757 p->
tcph->th_ack = htonl(1);
763 p->
tcph->th_seq = htonl(11);
764 p->
tcph->th_ack = htonl(1);
774 p->
tcph->th_seq = htonl(2);
775 p->
tcph->th_ack = htonl(1);
806 static int StreamTcpTest12(
void)
817 memset(&f, 0,
sizeof(
Flow));
820 memset(&tcph, 0,
sizeof(TCPHdr));
826 tcph.th_win = htons(5480);
827 tcph.th_seq = htonl(10);
828 tcph.th_ack = htonl(11);
836 p->
tcph->th_seq = htonl(10);
837 p->
tcph->th_ack = htonl(11);
848 p->
tcph->th_seq = htonl(6);
849 p->
tcph->th_ack = htonl(11);
866 printf(
"failed in setting asynchronous session\n");
871 printf(
"failed in setting state\n");
877 printf(
"failed in seq %" PRIu32
" match\n",
900 static int StreamTcpTest13(
void)
911 memset(&f, 0,
sizeof(
Flow));
914 memset(&tcph, 0,
sizeof(TCPHdr));
920 tcph.th_win = htons(5480);
921 tcph.th_seq = htonl(10);
922 tcph.th_ack = htonl(11);
930 p->
tcph->th_seq = htonl(10);
931 p->
tcph->th_ack = htonl(11);
942 p->
tcph->th_seq = htonl(6);
943 p->
tcph->th_ack = htonl(11);
960 printf(
"failed in setting asynchronous session\n");
965 printf(
"failed in setting state\n");
969 p->
tcph->th_seq = htonl(11);
970 p->
tcph->th_ack = htonl(9);
983 printf(
"failed in seq %" PRIu32
" match\n",
999 static const char *dummy_conf_string =
"%YAML 1.1\n"
1002 "default-log-dir: /var/log/eidps\n"
1006 " default-log-level: debug\n"
1008 " default-format: \"<%t> - <%l>\"\n"
1010 " default-startup-message: Your IDS has started.\n"
1012 " default-output-filter:\n"
1016 " windows: 192.168.0.1\n"
1018 " linux: 192.168.0.2\n"
1021 static const char *dummy_conf_string1 =
"%YAML 1.1\n"
1024 "default-log-dir: /var/log/eidps\n"
1028 " default-log-level: debug\n"
1030 " default-format: \"<%t> - <%l>\"\n"
1032 " default-startup-message: Your IDS has started.\n"
1034 " default-output-filter:\n"
1038 " windows: 192.168.0.0/24,"
1041 " linux: 192.168.1.0/24,"
1052 static const char *StreamTcpParseOSPolicy(
char *conf_var_name)
1055 char conf_var_type_name[15] =
"host-os-policy";
1056 char *conf_var_full_name = NULL;
1057 const char *conf_var_value = NULL;
1059 if (conf_var_name == NULL)
1063 conf_var_full_name = (
char *)
SCMalloc(strlen(conf_var_type_name) + strlen(conf_var_name) + 2);
1064 if (conf_var_full_name == NULL)
1067 if (snprintf(conf_var_full_name, strlen(conf_var_type_name) + strlen(conf_var_name) + 2,
1068 "%s.%s", conf_var_type_name, conf_var_name) < 0) {
1069 SCLogError(
"Error in making the conf full name");
1073 if (
ConfGet(conf_var_full_name, &conf_var_value) != 1) {
1074 SCLogError(
"Error in getting conf value for conf name %s", conf_var_full_name);
1078 SCLogDebug(
"Value obtained from the yaml conf file, for the var "
1080 conf_var_name, conf_var_value);
1083 if (conf_var_full_name != NULL)
1084 SCFree(conf_var_full_name);
1094 static int StreamTcpTest14(
void)
1103 struct in_addr addr;
1105 char os_policy_name[10] =
"windows";
1106 const char *ip_addr;
1110 memset(&f, 0,
sizeof(
Flow));
1113 memset(&tcph, 0,
sizeof(TCPHdr));
1114 memset(&addr, 0,
sizeof(addr));
1115 memset(&ipv4h, 0,
sizeof(ipv4h));
1128 ip_addr = StreamTcpParseOSPolicy(os_policy_name);
1130 strlcpy(os_policy_name,
"linux\0",
sizeof(os_policy_name));
1131 ip_addr = StreamTcpParseOSPolicy(os_policy_name);
1133 addr.s_addr = inet_addr(
"192.168.0.1");
1134 tcph.th_win = htons(5480);
1135 tcph.th_seq = htonl(10);
1136 tcph.th_ack = htonl(20);
1150 p->
tcph->th_seq = htonl(20);
1151 p->
tcph->th_ack = htonl(13);
1162 p->
tcph->th_seq = htonl(15);
1163 p->
tcph->th_ack = htonl(23);
1174 p->
tcph->th_seq = htonl(14);
1175 p->
tcph->th_ack = htonl(23);
1186 addr.s_addr = inet_addr(
"192.168.0.2");
1187 p->
tcph->th_seq = htonl(25);
1188 p->
tcph->th_ack = htonl(13);
1200 p->
tcph->th_seq = htonl(24);
1201 p->
tcph->th_ack = htonl(13);
1221 printf(
"failed in next_seq match client.next_seq %" PRIu32
""
1222 " server.next_seq %" PRIu32
"\n",
1230 printf(
"failed in setting up OS policy, client.os_policy: %" PRIu8
""
1231 " should be %" PRIu8
" and server.os_policy: %" PRIu8
""
1232 " should be %" PRIu8
"\n",
1256 static int StreamTcp4WHSTest01(
void)
1267 memset(&f, 0,
sizeof(
Flow));
1270 memset(&tcph, 0,
sizeof(TCPHdr));
1276 tcph.th_win = htons(5480);
1277 tcph.th_seq = htonl(10);
1285 p->
tcph->th_seq = htonl(20);
1286 p->
tcph->th_ack = 0;
1294 printf(
"STREAMTCP_FLAG_4WHS flag not set: ");
1298 p->
tcph->th_seq = htonl(10);
1299 p->
tcph->th_ack = htonl(21);
1306 p->
tcph->th_seq = htonl(21);
1307 p->
tcph->th_ack = htonl(10);
1315 printf(
"state is not ESTABLISHED: ");
1336 static int StreamTcp4WHSTest02(
void)
1347 memset(&f, 0,
sizeof(
Flow));
1350 memset(&tcph, 0,
sizeof(TCPHdr));
1356 tcph.th_win = htons(5480);
1357 tcph.th_seq = htonl(10);
1365 p->
tcph->th_seq = htonl(20);
1366 p->
tcph->th_ack = 0;
1374 printf(
"STREAMTCP_FLAG_4WHS flag not set: ");
1378 p->
tcph->th_seq = htonl(30);
1379 p->
tcph->th_ack = htonl(21);
1384 printf(
"SYN/ACK pkt not rejected but it should have: ");
1405 static int StreamTcp4WHSTest03(
void)
1416 memset(&f, 0,
sizeof(
Flow));
1419 memset(&tcph, 0,
sizeof(TCPHdr));
1425 tcph.th_win = htons(5480);
1426 tcph.th_seq = htonl(10);
1434 p->
tcph->th_seq = htonl(20);
1435 p->
tcph->th_ack = 0;
1443 printf(
"STREAMTCP_FLAG_4WHS flag not set: ");
1447 p->
tcph->th_seq = htonl(30);
1448 p->
tcph->th_ack = htonl(11);
1455 p->
tcph->th_seq = htonl(11);
1456 p->
tcph->th_ack = htonl(31);
1464 printf(
"state is not ESTABLISHED: ");
1484 static int StreamTcpTest15(
void)
1493 struct in_addr addr;
1495 char os_policy_name[10] =
"windows";
1496 const char *ip_addr;
1500 memset(&f, 0,
sizeof(
Flow));
1503 memset(&tcph, 0,
sizeof(TCPHdr));
1504 memset(&addr, 0,
sizeof(addr));
1505 memset(&ipv4h, 0,
sizeof(ipv4h));
1518 ip_addr = StreamTcpParseOSPolicy(os_policy_name);
1520 strlcpy(os_policy_name,
"linux\0",
sizeof(os_policy_name));
1521 ip_addr = StreamTcpParseOSPolicy(os_policy_name);
1523 addr.s_addr = inet_addr(
"192.168.0.20");
1524 tcph.th_win = htons(5480);
1525 tcph.th_seq = htonl(10);
1526 tcph.th_ack = htonl(20);
1540 p->
tcph->th_seq = htonl(20);
1541 p->
tcph->th_ack = htonl(13);
1552 p->
tcph->th_seq = htonl(15);
1553 p->
tcph->th_ack = htonl(23);
1564 p->
tcph->th_seq = htonl(14);
1565 p->
tcph->th_ack = htonl(23);
1576 addr.s_addr = inet_addr(
"192.168.1.20");
1577 p->
tcph->th_seq = htonl(25);
1578 p->
tcph->th_ack = htonl(13);
1590 p->
tcph->th_seq = htonl(24);
1591 p->
tcph->th_ack = htonl(13);
1611 printf(
"failed in next_seq match client.next_seq %" PRIu32
""
1612 " server.next_seq %" PRIu32
"\n",
1620 printf(
"failed in setting up OS policy, client.os_policy: %" PRIu8
""
1621 " should be %" PRIu8
" and server.os_policy: %" PRIu8
""
1622 " should be %" PRIu8
"\n",
1646 static int StreamTcpTest16(
void)
1655 struct in_addr addr;
1657 char os_policy_name[10] =
"windows";
1658 const char *ip_addr;
1662 memset(&f, 0,
sizeof(
Flow));
1665 memset(&tcph, 0,
sizeof(TCPHdr));
1666 memset(&addr, 0,
sizeof(addr));
1667 memset(&ipv4h, 0,
sizeof(ipv4h));
1680 ip_addr = StreamTcpParseOSPolicy(os_policy_name);
1682 strlcpy(os_policy_name,
"linux\0",
sizeof(os_policy_name));
1683 ip_addr = StreamTcpParseOSPolicy(os_policy_name);
1685 addr.s_addr = inet_addr(
"192.168.0.1");
1686 tcph.th_win = htons(5480);
1687 tcph.th_seq = htonl(10);
1688 tcph.th_ack = htonl(20);
1702 p->
tcph->th_seq = htonl(20);
1703 p->
tcph->th_ack = htonl(13);
1714 p->
tcph->th_seq = htonl(15);
1715 p->
tcph->th_ack = htonl(23);
1726 p->
tcph->th_seq = htonl(14);
1727 p->
tcph->th_ack = htonl(23);
1738 addr.s_addr = inet_addr(
"192.168.1.1");
1739 p->
tcph->th_seq = htonl(25);
1740 p->
tcph->th_ack = htonl(13);
1752 p->
tcph->th_seq = htonl(24);
1753 p->
tcph->th_ack = htonl(13);
1773 printf(
"failed in next_seq match client.next_seq %" PRIu32
""
1774 " server.next_seq %" PRIu32
"\n",
1782 printf(
"failed in setting up OS policy, client.os_policy: %" PRIu8
""
1783 " should be %" PRIu8
" and server.os_policy: %" PRIu8
""
1784 " should be %" PRIu8
"\n",
1809 static int StreamTcpTest17(
void)
1818 struct in_addr addr;
1820 char os_policy_name[10] =
"windows";
1821 const char *ip_addr;
1825 memset(&f, 0,
sizeof(
Flow));
1828 memset(&tcph, 0,
sizeof(TCPHdr));
1829 memset(&addr, 0,
sizeof(addr));
1830 memset(&ipv4h, 0,
sizeof(ipv4h));
1843 ip_addr = StreamTcpParseOSPolicy(os_policy_name);
1845 strlcpy(os_policy_name,
"linux\0",
sizeof(os_policy_name));
1846 ip_addr = StreamTcpParseOSPolicy(os_policy_name);
1848 addr.s_addr = inet_addr(
"192.168.0.1");
1849 tcph.th_win = htons(5480);
1850 tcph.th_seq = htonl(10);
1851 tcph.th_ack = htonl(20);
1865 p->
tcph->th_seq = htonl(20);
1866 p->
tcph->th_ack = htonl(13);
1877 p->
tcph->th_seq = htonl(15);
1878 p->
tcph->th_ack = htonl(23);
1889 p->
tcph->th_seq = htonl(14);
1890 p->
tcph->th_ack = htonl(23);
1901 addr.s_addr = inet_addr(
"10.1.1.1");
1902 p->
tcph->th_seq = htonl(25);
1903 p->
tcph->th_ack = htonl(13);
1915 p->
tcph->th_seq = htonl(24);
1916 p->
tcph->th_ack = htonl(13);
1936 printf(
"failed in next_seq match client.next_seq %" PRIu32
""
1937 " server.next_seq %" PRIu32
"\n",
1945 printf(
"failed in setting up OS policy, client.os_policy: %" PRIu8
""
1946 " should be %" PRIu8
" and server.os_policy: %" PRIu8
""
1947 " should be %" PRIu8
"\n",
1966 static int StreamTcpTest18(
void)
1969 struct in_addr addr;
1970 char os_policy_name[10] =
"windows";
1971 const char *ip_addr;
1978 memset(&addr, 0,
sizeof(addr));
1979 memset(&stream, 0,
sizeof(stream));
1980 memset(&ipv4h, 0,
sizeof(ipv4h));
1991 ip_addr = StreamTcpParseOSPolicy(os_policy_name);
1996 addr.s_addr = inet_addr(
"192.168.1.1");
2013 static int StreamTcpTest19(
void)
2016 struct in_addr addr;
2017 char os_policy_name[10] =
"windows";
2018 const char *ip_addr;
2025 memset(&addr, 0,
sizeof(addr));
2026 memset(&stream, 0,
sizeof(stream));
2027 memset(&ipv4h, 0,
sizeof(ipv4h));
2038 ip_addr = StreamTcpParseOSPolicy(os_policy_name);
2043 addr.s_addr = inet_addr(
"192.168.0.30");
2048 printf(
"expected os_policy: %" PRIu8
" but received %" PRIu8
": ",
2063 static int StreamTcpTest20(
void)
2066 struct in_addr addr;
2067 char os_policy_name[10] =
"linux";
2068 const char *ip_addr;
2075 memset(&addr, 0,
sizeof(addr));
2076 memset(&stream, 0,
sizeof(stream));
2077 memset(&ipv4h, 0,
sizeof(ipv4h));
2088 ip_addr = StreamTcpParseOSPolicy(os_policy_name);
2093 addr.s_addr = inet_addr(
"192.168.0.1");
2098 printf(
"expected os_policy: %" PRIu8
" but received %" PRIu8
"\n", (uint8_t)
OS_POLICY_LINUX,
2113 static int StreamTcpTest21(
void)
2116 struct in_addr addr;
2117 char os_policy_name[10] =
"linux";
2118 const char *ip_addr;
2125 memset(&addr, 0,
sizeof(addr));
2126 memset(&stream, 0,
sizeof(stream));
2127 memset(&ipv4h, 0,
sizeof(ipv4h));
2138 ip_addr = StreamTcpParseOSPolicy(os_policy_name);
2143 addr.s_addr = inet_addr(
"192.168.1.30");
2148 printf(
"expected os_policy: %" PRIu8
" but received %" PRIu8
"\n", (uint8_t)
OS_POLICY_LINUX,
2163 static int StreamTcpTest22(
void)
2166 struct in_addr addr;
2167 char os_policy_name[10] =
"windows";
2168 const char *ip_addr;
2175 memset(&addr, 0,
sizeof(addr));
2176 memset(&stream, 0,
sizeof(stream));
2177 memset(&ipv4h, 0,
sizeof(ipv4h));
2188 ip_addr = StreamTcpParseOSPolicy(os_policy_name);
2193 addr.s_addr = inet_addr(
"123.231.2.1");
2198 printf(
"expected os_policy: %" PRIu8
" but received %" PRIu8
"\n",
2213 static int StreamTcpTest23(
void)
2219 uint8_t packet[1460] =
"";
2225 memset(&f, 0,
sizeof(
Flow));
2226 memset(&tcph, 0,
sizeof(TCPHdr));
2236 p->
proto = IPPROTO_TCP;
2245 p->
tcph->th_seq = htonl(3184324453UL);
2246 p->
tcph->th_ack = htonl(3373419609UL);
2251 p->
tcph->th_seq = htonl(3184324455UL);
2252 p->
tcph->th_ack = htonl(3373419621UL);
2257 p->
tcph->th_seq = htonl(3184324453UL);
2258 p->
tcph->th_ack = htonl(3373419621UL);
2276 static int StreamTcpTest24(
void)
2284 uint8_t packet[1460] =
"";
2291 memset(&f, 0,
sizeof(
Flow));
2292 memset(&tcph, 0,
sizeof(TCPHdr));
2298 p->
proto = IPPROTO_TCP;
2308 p->
tcph->th_seq = htonl(3184324455UL);
2309 p->
tcph->th_ack = htonl(3373419621UL);
2314 p->
tcph->th_seq = htonl(3184324459UL);
2315 p->
tcph->th_ack = htonl(3373419633UL);
2320 p->
tcph->th_seq = htonl(3184324459UL);
2321 p->
tcph->th_ack = htonl(3373419657UL);
2343 static int StreamTcpTest25(
void)
2356 memset(&f, 0,
sizeof(
Flow));
2359 memset(&tcph, 0,
sizeof(TCPHdr));
2363 tcph.th_win = htons(5480);
2372 p->
tcph->th_ack = htonl(1);
2379 p->
tcph->th_ack = htonl(1);
2380 p->
tcph->th_seq = htonl(1);
2387 p->
tcph->th_ack = htonl(1);
2388 p->
tcph->th_seq = htonl(2);
2403 p->
tcph->th_ack = htonl(1);
2404 p->
tcph->th_seq = htonl(6);
2434 static int StreamTcpTest26(
void)
2447 memset(&f, 0,
sizeof(
Flow));
2450 memset(&tcph, 0,
sizeof(TCPHdr));
2454 tcph.th_win = htons(5480);
2464 p->
tcph->th_ack = htonl(1);
2471 p->
tcph->th_ack = htonl(1);
2472 p->
tcph->th_seq = htonl(1);
2479 p->
tcph->th_ack = htonl(1);
2480 p->
tcph->th_seq = htonl(2);
2495 p->
tcph->th_ack = htonl(1);
2496 p->
tcph->th_seq = htonl(6);
2526 static int StreamTcpTest27(
void)
2539 memset(&f, 0,
sizeof(
Flow));
2542 memset(&tcph, 0,
sizeof(TCPHdr));
2546 tcph.th_win = htons(5480);
2556 p->
tcph->th_ack = htonl(1);
2563 p->
tcph->th_ack = htonl(1);
2564 p->
tcph->th_seq = htonl(1);
2571 p->
tcph->th_ack = htonl(1);
2572 p->
tcph->th_seq = htonl(2);
2587 p->
tcph->th_ack = htonl(1);
2588 p->
tcph->th_seq = htonl(6);
2614 static int StreamTcpTest28(
void)
2642 static int StreamTcpTest37(
void)
2655 memset(&f, 0,
sizeof(
Flow));
2658 memset(&tcph, 0,
sizeof(TCPHdr));
2663 tcph.th_win = htons(5480);
2671 printf(
"failed in processing packet\n");
2675 p->
tcph->th_ack = htonl(1);
2680 printf(
"failed in processing packet\n");
2684 p->
tcph->th_ack = htonl(1);
2685 p->
tcph->th_seq = htonl(1);
2690 printf(
"failed in processing packet\n");
2695 printf(
"the TCP state should be TCP_ESTABLISHED\n");
2699 p->
tcph->th_ack = htonl(2);
2700 p->
tcph->th_seq = htonl(4);
2705 printf(
"failed in processing packet\n");
2710 printf(
"the TCP state should be TCP_CLOSE_WAIT\n");
2714 p->
tcph->th_ack = htonl(1);
2715 p->
tcph->th_seq = htonl(1);
2724 printf(
"failed in processing packet\n");
2728 p->
tcph->th_ack = htonl(4);
2729 p->
tcph->th_seq = htonl(2);
2735 printf(
"failed in processing packet\n");
2759 static int StreamTcpTest38(
void)
2765 uint8_t payload[128];
2769 memset(&f, 0,
sizeof(
Flow));
2772 memset(&tcph, 0,
sizeof(TCPHdr));
2780 tcph.th_win = htons(5480);
2787 printf(
"failed in processing packet in StreamTcpPacket\n");
2791 p->
tcph->th_ack = htonl(1);
2796 printf(
"failed in processing packet in StreamTcpPacket\n");
2800 p->
tcph->th_ack = htonl(1);
2801 p->
tcph->th_seq = htonl(1);
2806 printf(
"failed in processing packet in StreamTcpPacket\n");
2810 p->
tcph->th_ack = htonl(29847);
2811 p->
tcph->th_seq = htonl(2);
2820 printf(
"failed in processing packet in StreamTcpPacket\n");
2827 printf(
"the server.last_ack should be 1, but it is %" PRIu32
"\n",
2832 p->
tcph->th_ack = htonl(1);
2833 p->
tcph->th_seq = htonl(1);
2842 printf(
"failed in processing packet in StreamTcpPacket\n");
2847 printf(
"the server.next_seq should be 128, but it is %" PRIu32
"\n",
2852 p->
tcph->th_ack = htonl(256);
2853 p->
tcph->th_seq = htonl(5);
2862 printf(
"failed in processing packet in StreamTcpPacket\n");
2869 printf(
"the server.last_ack should be 1, but it is %" PRIu32
"\n",
2874 p->
tcph->th_ack = htonl(128);
2875 p->
tcph->th_seq = htonl(8);
2884 printf(
"failed in processing packet in StreamTcpPacket\n");
2891 printf(
"the server.last_ack should be 256, but it is %" PRIu32
"\n",
2913 static int StreamTcpTest39(
void)
2922 memset(&f, 0,
sizeof(
Flow));
2925 memset(&tcph, 0,
sizeof(TCPHdr));
2933 tcph.th_win = htons(5480);
2942 printf(
"failed in processing packet in StreamTcpPacket\n");
2946 p->
tcph->th_ack = htonl(1);
2951 printf(
"failed in processing packet in StreamTcpPacket\n");
2955 p->
tcph->th_ack = htonl(1);
2956 p->
tcph->th_seq = htonl(1);
2961 printf(
"failed in processing packet in StreamTcpPacket\n");
2965 p->
tcph->th_ack = htonl(1);
2966 p->
tcph->th_seq = htonl(1);
2975 printf(
"failed in processing packet in StreamTcpPacket\n");
2980 printf(
"the server.next_seq should be 4, but it is %" PRIu32
"\n",
2985 p->
tcph->th_ack = htonl(4);
2986 p->
tcph->th_seq = htonl(2);
2995 printf(
"failed in processing packet in StreamTcpPacket\n");
3002 printf(
"the server.last_ack should be 4, but it is %" PRIu32
"\n",
3007 p->
tcph->th_seq = htonl(4);
3008 p->
tcph->th_ack = htonl(5);
3017 printf(
"failed in processing packet in StreamTcpPacket\n");
3024 printf(
"the server.next_seq should be 7, but it is %" PRIu32
"\n",
3040 static int StreamTcpTest42(
void)
3053 memset(&f, 0,
sizeof(
Flow));
3056 memset(&tcph, 0,
sizeof(TCPHdr));
3062 tcph.th_win = htons(5480);
3067 tcph.th_seq = htonl(100);
3074 p->
tcph->th_seq = htonl(500);
3075 p->
tcph->th_ack = htonl(101);
3083 p->
tcph->th_seq = htonl(1000);
3084 p->
tcph->th_ack = htonl(101);
3092 p->
tcph->th_ack = htonl(501);
3093 p->
tcph->th_seq = htonl(101);
3103 printf(
"state not TCP_ESTABLISHED: ");
3127 static int StreamTcpTest43(
void)
3140 memset(&f, 0,
sizeof(
Flow));
3143 memset(&tcph, 0,
sizeof(TCPHdr));
3149 tcph.th_win = htons(5480);
3154 tcph.th_seq = htonl(100);
3161 p->
tcph->th_seq = htonl(500);
3162 p->
tcph->th_ack = htonl(101);
3170 p->
tcph->th_seq = htonl(1000);
3171 p->
tcph->th_ack = htonl(101);
3179 p->
tcph->th_ack = htonl(1001);
3180 p->
tcph->th_seq = htonl(101);
3190 printf(
"state not TCP_ESTABLISHED: ");
3214 static int StreamTcpTest44(
void)
3227 memset(&f, 0,
sizeof(
Flow));
3230 memset(&tcph, 0,
sizeof(TCPHdr));
3236 tcph.th_win = htons(5480);
3241 tcph.th_seq = htonl(100);
3248 p->
tcph->th_seq = htonl(500);
3249 p->
tcph->th_ack = htonl(101);
3257 p->
tcph->th_seq = htonl(1000);
3258 p->
tcph->th_ack = htonl(101);
3266 p->
tcph->th_ack = htonl(3001);
3267 p->
tcph->th_seq = htonl(101);
3297 static int StreamTcpTest45(
void)
3310 memset(&f, 0,
sizeof(
Flow));
3313 memset(&tcph, 0,
sizeof(TCPHdr));
3320 tcph.th_win = htons(5480);
3325 tcph.th_seq = htonl(100);
3332 p->
tcph->th_seq = htonl(500);
3333 p->
tcph->th_ack = htonl(101);
3341 p->
tcph->th_seq = htonl(1000);
3342 p->
tcph->th_ack = htonl(101);
3350 p->
tcph->th_seq = htonl(2000);
3351 p->
tcph->th_ack = htonl(101);
3359 p->
tcph->th_seq = htonl(3000);
3360 p->
tcph->th_ack = htonl(101);
3368 p->
tcph->th_ack = htonl(1001);
3369 p->
tcph->th_seq = htonl(101);
3379 printf(
"state not TCP_ESTABLISHED: ");
3403 UtRegisterTest(
"StreamTcpTest01 -- TCP session allocation", StreamTcpTest01);
3404 UtRegisterTest(
"StreamTcpTest02 -- TCP session deallocation", StreamTcpTest02);
3405 UtRegisterTest(
"StreamTcpTest03 -- SYN missed MidStream session", StreamTcpTest03);
3406 UtRegisterTest(
"StreamTcpTest04 -- SYN/ACK missed MidStream session", StreamTcpTest04);
3407 UtRegisterTest(
"StreamTcpTest05 -- 3WHS missed MidStream session", StreamTcpTest05);
3408 UtRegisterTest(
"StreamTcpTest06 -- FIN, RST message MidStream session", StreamTcpTest06);
3409 UtRegisterTest(
"StreamTcpTest07 -- PAWS invalid timestamp", StreamTcpTest07);
3410 UtRegisterTest(
"StreamTcpTest08 -- PAWS valid timestamp", StreamTcpTest08);
3411 UtRegisterTest(
"StreamTcpTest09 -- No Client Reassembly", StreamTcpTest09);
3412 UtRegisterTest(
"StreamTcpTest10 -- No missed packet Async stream", StreamTcpTest10);
3413 UtRegisterTest(
"StreamTcpTest11 -- SYN missed Async stream", StreamTcpTest11);
3414 UtRegisterTest(
"StreamTcpTest12 -- SYN/ACK missed Async stream", StreamTcpTest12);
3415 UtRegisterTest(
"StreamTcpTest13 -- opposite stream packets for Async "
3421 UtRegisterTest(
"StreamTcpTest14 -- setup OS policy", StreamTcpTest14);
3422 UtRegisterTest(
"StreamTcpTest15 -- setup OS policy", StreamTcpTest15);
3423 UtRegisterTest(
"StreamTcpTest16 -- setup OS policy", StreamTcpTest16);
3424 UtRegisterTest(
"StreamTcpTest17 -- setup OS policy", StreamTcpTest17);
3425 UtRegisterTest(
"StreamTcpTest18 -- setup OS policy", StreamTcpTest18);
3426 UtRegisterTest(
"StreamTcpTest19 -- setup OS policy", StreamTcpTest19);
3427 UtRegisterTest(
"StreamTcpTest20 -- setup OS policy", StreamTcpTest20);
3428 UtRegisterTest(
"StreamTcpTest21 -- setup OS policy", StreamTcpTest21);
3429 UtRegisterTest(
"StreamTcpTest22 -- setup OS policy", StreamTcpTest22);
3430 UtRegisterTest(
"StreamTcpTest23 -- stream memory leaks", StreamTcpTest23);
3431 UtRegisterTest(
"StreamTcpTest24 -- stream memory leaks", StreamTcpTest24);
3432 UtRegisterTest(
"StreamTcpTest25 -- test ecn/cwr sessions", StreamTcpTest25);
3433 UtRegisterTest(
"StreamTcpTest26 -- test ecn/cwr sessions", StreamTcpTest26);
3434 UtRegisterTest(
"StreamTcpTest27 -- test ecn/cwr sessions", StreamTcpTest27);
3435 UtRegisterTest(
"StreamTcpTest28 -- Memcap Test", StreamTcpTest28);
3440 UtRegisterTest(
"StreamTcpTest29 -- Badchecksum Reset Test", StreamTcpTest29, 1);
3441 UtRegisterTest(
"StreamTcpTest30 -- Badchecksum Overlap Test", StreamTcpTest30, 1);
3442 UtRegisterTest(
"StreamTcpTest31 -- MultipleSyns Test", StreamTcpTest31, 1);
3443 UtRegisterTest(
"StreamTcpTest32 -- Bogus CWR Test", StreamTcpTest32, 1);
3444 UtRegisterTest(
"StreamTcpTest33 -- RST-SYN Again Test", StreamTcpTest33, 1);
3445 UtRegisterTest(
"StreamTcpTest34 -- SYN-PUSH Test", StreamTcpTest34, 1);
3446 UtRegisterTest(
"StreamTcpTest35 -- SYN-URG Test", StreamTcpTest35, 1);
3447 UtRegisterTest(
"StreamTcpTest36 -- PUSH-URG Test", StreamTcpTest36, 1);
3449 UtRegisterTest(
"StreamTcpTest37 -- Out of order FIN Test", StreamTcpTest37);
3451 UtRegisterTest(
"StreamTcpTest38 -- validate ACK", StreamTcpTest38);
3452 UtRegisterTest(
"StreamTcpTest39 -- update next_seq", StreamTcpTest39);
3454 UtRegisterTest(
"StreamTcpTest42 -- SYN/ACK queue", StreamTcpTest42);
3455 UtRegisterTest(
"StreamTcpTest43 -- SYN/ACK queue", StreamTcpTest43);
3456 UtRegisterTest(
"StreamTcpTest44 -- SYN/ACK queue", StreamTcpTest44);
3457 UtRegisterTest(
"StreamTcpTest45 -- SYN/ACK queue", StreamTcpTest45);