66 #define DEFAULT_DEFRAG_HASH_SIZE 0xffff
67 #define DEFAULT_DEFRAG_POOL_SIZE 0xffff
73 #define TIMEOUT_DEFAULT 60
78 #define TIMEOUT_MAX (60 * 60 * 24)
117 printf(
"Dumping frags for packet: ID=%d\n", tracker->
id);
119 printf(
"-> Frag: frag_offset=%d, frag_len=%d, data_len=%d, ltrim=%d, skip=%d\n", frag->
offset, frag->
len, frag->
data_len, frag->
ltrim, frag->
skip);
130 DefragFragReset(
Frag *frag)
132 if (frag->
pkt != NULL)
134 memset(frag, 0,
sizeof(*frag));
141 DefragFragInit(
void *data,
void *initdata)
145 memset(frag, 0,
sizeof(*frag));
162 DefragFragReset(frag);
176 DefragContextNew(
void)
185 intmax_t tracker_pool_size;
186 if (!
ConfGetInt(
"defrag.trackers", &tracker_pool_size) || tracker_pool_size == 0) {
191 intmax_t frag_pool_size;
192 if (!
ConfGetInt(
"defrag.max-frags", &frag_pool_size) || frag_pool_size == 0) {
195 intmax_t frag_pool_prealloc = frag_pool_size / 2;
198 NULL, DefragFragInit, dc, NULL, NULL);
200 FatalError(
"Defrag: Failed to initialize fragment pool.");
203 FatalError(
"Defrag: Failed to initialize frag pool mutex.");
208 if (!
ConfGetInt(
"defrag.timeout", &timeout)) {
213 FatalError(
"defrag: Timeout less than minimum allowed value.");
216 FatalError(
"defrag: Timeout greater than maximum allowed value.");
223 SCLogDebug(
"\tMaximum defrag trackers: %"PRIuMAX, tracker_pool_size);
224 SCLogDebug(
"\tPreallocated defrag trackers: %"PRIuMAX, tracker_pool_size);
225 SCLogDebug(
"\tMaximum fragments: %"PRIuMAX, (uintmax_t)frag_pool_size);
226 SCLogDebug(
"\tPreallocated fragments: %"PRIuMAX, (uintmax_t)frag_pool_prealloc);
260 }
else if (first->
offset != 0) {
265 goto error_remove_tracker;
287 goto error_remove_tracker;
293 int fragmentable_offset = 0;
294 uint16_t fragmentable_len = 0;
296 int ip_hdr_offset = 0;
299 SCLogDebug(
"frag %p, data_len %u, offset %u, pcap_cnt %"PRIu64,
309 goto error_remove_tracker;
321 int pkt_end = fragmentable_offset + frag->
offset + frag->
data_len;
324 "fragmented packet, exceeds size of packet buffer.");
325 goto error_remove_tracker;
331 goto error_remove_tracker;
335 "fragmentable_len exceeds UINT16_MAX");
336 goto error_remove_tracker;
347 SCLogDebug(
"ip_hdr_offset %u, hlen %" PRIu16
", fragmentable_len %" PRIu16, ip_hdr_offset, hlen,
353 rp->
ip4h->
ip_len = htons(fragmentable_len + hlen);
357 SET_PKT_LEN(rp, ip_hdr_offset + hlen + fragmentable_len);
364 error_remove_tracker:
390 }
else if (first->
offset != 0) {
395 goto error_remove_tracker;
430 goto error_remove_tracker;
434 uint16_t unfragmentable_len = 0;
435 int fragmentable_offset = 0;
436 uint16_t fragmentable_len = 0;
437 int ip_hdr_offset = 0;
438 uint8_t next_hdr = 0;
445 IPV6FragHdr *frag_hdr = (IPV6FragHdr *)(frag->
pkt +
447 next_hdr = frag_hdr->ip6fh_nxt;
453 goto error_remove_tracker;
457 goto error_remove_tracker;
471 unfragmentable_len = (uint16_t)(fragmentable_offset - ip_hdr_offset -
IPV6_HEADER_LEN);
472 if (unfragmentable_len >= fragmentable_offset)
473 goto error_remove_tracker;
479 goto error_remove_tracker;
491 rp->
ip6h->s_ip6_plen = htons(fragmentable_len + unfragmentable_len);
496 if (unfragmentable_len == 0)
497 rp->
ip6h->s_ip6_nxt = next_hdr;
499 unfragmentable_len + fragmentable_len);
506 error_remove_tracker:
540 uint16_t frag_offset;
547 uint16_t data_offset;
557 uint16_t ip_hdr_offset;
560 uint16_t frag_hdr_offset = 0;
563 int af = tracker->
af;
567 uint32_t ip6_nh_set_offset = 0;
568 uint8_t ip6_nh_set_value = 0;
574 if (tracker->
af == AF_INET) {
580 frag_end = frag_offset + data_len;
590 else if (tracker->
af == AF_INET6) {
595 frag_end = frag_offset + data_len;
599 SCLogDebug(
"mf %s frag_offset %u data_offset %u, data_len %u, "
600 "frag_end %u, ip_hdr_offset %u, frag_hdr_offset %u",
601 more_frags ?
"true" :
"false", frag_offset, data_offset,
602 data_len, frag_end, ip_hdr_offset, frag_hdr_offset);
606 SCLogDebug(
"we have exthdrs before fraghdr %u bytes",
615 SCLogDebug(
"offset %d, value %u", ip6_nh_set_offset, ip6_nh_set_value);
634 bool overlap =
false;
639 .
offset = frag_offset - 1,
644 next = IP_FRAGMENTS_RB_NEXT(prev);
646 prev = IP_FRAGMENTS_RB_PREV(
next);
649 next = IP_FRAGMENTS_RB_NEXT(prev);
652 while (prev != NULL) {
660 switch (tracker->
policy) {
663 if (frag_offset >= prev->
offset) {
666 if ((
next != NULL) && (frag_end >
next->offset)) {
667 next->ltrim = frag_end -
next->offset;
669 if ((frag_offset < prev->
offset) &&
684 if (prev->
offset + prev->
ltrim < frag_offset + ltrim &&
697 if (frag_offset + ltrim < prev->
offset + prev->
ltrim &&
708 if (frag_offset + ltrim <= prev->
offset + prev->
ltrim &&
717 if (frag_offset + ltrim >= prev->
offset + ltrim &&
724 if (frag_offset + ltrim < prev->
offset + ltrim &&
737 if (frag_offset + ltrim > prev->
offset + prev->
ltrim &&
746 if (frag_offset + ltrim == prev->
offset + ltrim &&
754 if (frag_offset >= prev->
offset) {
757 if ((frag_offset < prev->
offset) &&
765 if ((frag_offset >= prev->
offset) &&
769 if (frag_offset < prev->
offset) {
778 if (frag_offset <= prev->
offset) {
779 if (frag_end > prev->
offset) {
802 DefragFragReset(prev);
811 if (ltrim > data_len) {
830 if (new->pkt == NULL) {
846 if (ip6_nh_set_offset > 0 && frag_offset == 0 && ltrim == 0) {
847 if (new->len > ip6_nh_set_offset) {
848 SCLogDebug(
"updating frag to have 'correct' nh value: %u -> %u",
849 new->pkt[ip6_nh_set_offset], ip6_nh_set_value);
850 new->pkt[ip6_nh_set_offset] = ip6_nh_set_value;
855 new->offset = frag_offset + ltrim;
856 new->data_offset = data_offset;
857 new->data_len = data_len - ltrim;
858 new->ip_hdr_offset = ip_hdr_offset;
859 new->frag_hdr_offset = frag_hdr_offset;
860 new->more_frags = more_frags;
862 new->pcap_cnt = pcap_cnt;
872 if (tracker->
af == AF_INET) {
873 r = Defrag4Reassemble(
tv, tracker, p);
874 if (r != NULL &&
tv != NULL &&
dtv != NULL) {
888 else if (tracker->
af == AF_INET6) {
889 r = Defrag6Reassemble(
tv, tracker, p);
890 if (r != NULL &&
tv != NULL &&
dtv != NULL) {
941 return default_policy;
984 return default_policy;
1010 uint16_t frag_offset;
1029 if (frag_offset == 0 && more_frags == 0) {
1033 if (
tv != NULL &&
dtv != NULL) {
1034 if (
af == AF_INET) {
1037 else if (
af == AF_INET6) {
1043 tracker = DefragGetTracker(
tv,
dtv, p);
1044 if (tracker == NULL) {
1045 if (
tv != NULL &&
dtv != NULL) {
1051 Packet *rp = DefragInsertFrag(
tv,
dtv, tracker, p);
1060 intmax_t tracker_pool_size;
1061 if (!
ConfGetInt(
"defrag.trackers", &tracker_pool_size)) {
1069 defrag_context = DefragContextNew();
1070 if (defrag_context == NULL) {
1071 FatalError(
"Failed to allocate memory for the Defrag module.");
1081 DefragContextDestroy(defrag_context);
1082 defrag_context = NULL;
1090 #define IP_MF 0x2000
1096 static Packet *BuildTestPacket(uint8_t
proto, uint16_t
id, uint16_t off,
int mf,
1097 const char content,
int content_len)
1111 struct timeval tval;
1112 gettimeofday(&tval, NULL);
1117 ip4h.
ip_len = htons(hlen + content_len);
1118 ip4h.
ip_id = htons(
id);
1122 ip4h.
ip_off = htons(off);
1126 ip4h.s_ip_src.s_addr = 0x01010101;
1127 ip4h.s_ip_dst.s_addr = 0x02020202;
1135 pcontent =
SCCalloc(1, content_len);
1138 memset(pcontent, content, content_len);
1170 static Packet *IPV6BuildTestPacket(uint8_t
proto, uint32_t
id, uint16_t off,
1171 int mf,
const char content,
int content_len)
1183 struct timeval tval;
1184 gettimeofday(&tval, NULL);
1187 ip6h.s_ip6_nxt = 44;
1188 ip6h.s_ip6_hlim = 2;
1191 ip6h.s_ip6_src[0] = 0x01010101;
1192 ip6h.s_ip6_src[1] = 0x01010101;
1193 ip6h.s_ip6_src[2] = 0x01010101;
1194 ip6h.s_ip6_src[3] = 0x01010101;
1195 ip6h.s_ip6_dst[0] = 0x02020202;
1196 ip6h.s_ip6_dst[1] = 0x02020202;
1197 ip6h.s_ip6_dst[2] = 0x02020202;
1198 ip6h.s_ip6_dst[3] = 0x02020202;
1207 fh->ip6fh_nxt =
proto;
1208 fh->ip6fh_ident = htonl(
id);
1209 fh->ip6fh_offlg = htons((off << 3) | mf);
1213 pcontent =
SCCalloc(1, content_len);
1216 memset(pcontent, content, content_len);
1221 p->
ip6h->s_ip6_plen = htons(
sizeof(IPV6FragHdr) + content_len);
1245 static int DefragInOrderSimpleTest(
void)
1247 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1248 Packet *reassembled = NULL;
1254 p1 = BuildTestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 8);
1256 p2 = BuildTestPacket(IPPROTO_ICMP,
id, 1, 1,
'B', 8);
1258 p3 = BuildTestPacket(IPPROTO_ICMP,
id, 2, 0,
'C', 3);
1264 reassembled =
Defrag(NULL, NULL, p3);
1271 for (i = 20; i < 20 + 8; i++) {
1276 for (i = 28; i < 28 + 8; i++) {
1281 for (i = 36; i < 36 + 3; i++) {
1297 static int DefragReverseSimpleTest(
void)
1299 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1300 Packet *reassembled = NULL;
1306 p1 = BuildTestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 8);
1308 p2 = BuildTestPacket(IPPROTO_ICMP,
id, 1, 1,
'B', 8);
1310 p3 = BuildTestPacket(IPPROTO_ICMP,
id, 2, 0,
'C', 3);
1316 reassembled =
Defrag(NULL, NULL, p1);
1323 for (i = 20; i < 20 + 8; i++) {
1328 for (i = 28; i < 28 + 8; i++) {
1333 for (i = 36; i < 36 + 3; i++) {
1350 static int IPV6DefragInOrderSimpleTest(
void)
1352 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1353 Packet *reassembled = NULL;
1359 p1 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 0, 1,
'A', 8);
1361 p2 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 1, 1,
'B', 8);
1363 p3 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 2, 0,
'C', 3);
1368 reassembled =
Defrag(NULL, NULL, p3);
1374 for (i = 40; i < 40 + 8; i++) {
1379 for (i = 48; i < 48 + 8; i++) {
1384 for (i = 56; i < 56 + 3; i++) {
1397 static int IPV6DefragReverseSimpleTest(
void)
1400 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1401 Packet *reassembled = NULL;
1407 dc = DefragContextNew();
1410 p1 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 0, 1,
'A', 8);
1412 p2 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 1, 1,
'B', 8);
1414 p3 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 2, 0,
'C', 3);
1419 reassembled =
Defrag(NULL, NULL, p1);
1423 for (i = 40; i < 40 + 8; i++) {
1428 for (i = 48; i < 48 + 8; i++) {
1433 for (i = 56; i < 56 + 3; i++) {
1437 DefragContextDestroy(dc);
1447 static int DefragDoSturgesNovakTest(
int policy, u_char *expected,
1448 size_t expected_len)
1460 memset(packets, 0x00,
sizeof(packets));
1467 packets[0] = BuildTestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 24);
1470 packets[1] = BuildTestPacket(IPPROTO_ICMP,
id, 32 >> 3, 1,
'B', 16);
1473 packets[2] = BuildTestPacket(IPPROTO_ICMP,
id, 48 >> 3, 1,
'C', 24);
1476 packets[3] = BuildTestPacket(IPPROTO_ICMP,
id, 80 >> 3, 1,
'D', 8);
1479 packets[4] = BuildTestPacket(IPPROTO_ICMP,
id, 104 >> 3, 1,
'E', 16);
1482 packets[5] = BuildTestPacket(IPPROTO_ICMP,
id, 120 >> 3, 1,
'F', 24);
1485 packets[6] = BuildTestPacket(IPPROTO_ICMP,
id, 144 >> 3, 1,
'G', 16);
1488 packets[7] = BuildTestPacket(IPPROTO_ICMP,
id, 160 >> 3, 1,
'H', 16);
1491 packets[8] = BuildTestPacket(IPPROTO_ICMP,
id, 176 >> 3, 1,
'I', 8);
1498 packets[9] = BuildTestPacket(IPPROTO_ICMP,
id, 8 >> 3, 1,
'J', 32);
1501 packets[10] = BuildTestPacket(IPPROTO_ICMP,
id, 48 >> 3, 1,
'K', 24);
1504 packets[11] = BuildTestPacket(IPPROTO_ICMP,
id, 72 >> 3, 1,
'L', 24);
1507 packets[12] = BuildTestPacket(IPPROTO_ICMP,
id, 96 >> 3, 1,
'M', 24);
1510 packets[13] = BuildTestPacket(IPPROTO_ICMP,
id, 128 >> 3, 1,
'N', 8);
1513 packets[14] = BuildTestPacket(IPPROTO_ICMP,
id, 152 >> 3, 1,
'O', 8);
1516 packets[15] = BuildTestPacket(IPPROTO_ICMP,
id, 160 >> 3, 1,
'P', 8);
1519 packets[16] = BuildTestPacket(IPPROTO_ICMP,
id, 176 >> 3, 0,
'Q', 16);
1521 default_policy = policy;
1524 for (i = 0; i < 9; i++) {
1530 for (; i < 16; i++) {
1552 for (i = 0; i < 17; i++) {
1559 static int IPV6DefragDoSturgesNovakTest(
int policy, u_char *expected,
1560 size_t expected_len)
1572 memset(packets, 0x00,
sizeof(packets));
1579 packets[0] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 0, 1,
'A', 24);
1582 packets[1] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 32 >> 3, 1,
'B', 16);
1585 packets[2] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 48 >> 3, 1,
'C', 24);
1588 packets[3] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 80 >> 3, 1,
'D', 8);
1591 packets[4] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 104 >> 3, 1,
'E', 16);
1594 packets[5] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 120 >> 3, 1,
'F', 24);
1597 packets[6] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 144 >> 3, 1,
'G', 16);
1600 packets[7] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 160 >> 3, 1,
'H', 16);
1603 packets[8] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 176 >> 3, 1,
'I', 8);
1610 packets[9] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 8 >> 3, 1,
'J', 32);
1613 packets[10] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 48 >> 3, 1,
'K', 24);
1616 packets[11] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 72 >> 3, 1,
'L', 24);
1619 packets[12] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 96 >> 3, 1,
'M', 24);
1622 packets[13] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 128 >> 3, 1,
'N', 8);
1625 packets[14] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 152 >> 3, 1,
'O', 8);
1628 packets[15] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 160 >> 3, 1,
'P', 8);
1631 packets[16] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 176 >> 3, 0,
'Q', 16);
1633 default_policy = policy;
1636 for (i = 0; i < 9; i++) {
1642 for (; i < 16; i++) {
1663 for (i = 0; i < 17; i++) {
1671 DefragSturgesNovakBsdTest(
void)
1674 u_char expected[] = {
1706 static int IPV6DefragSturgesNovakBsdTest(
void)
1709 u_char expected[] = {
1741 static int DefragSturgesNovakLinuxIpv4Test(
void)
1744 u_char expected[] = {
1776 static int IPV6DefragSturgesNovakLinuxTest(
void)
1779 u_char expected[] = {
1811 static int DefragSturgesNovakWindowsIpv4Test(
void)
1814 u_char expected[] = {
1846 static int IPV6DefragSturgesNovakWindowsTest(
void)
1849 u_char expected[] = {
1881 static int DefragSturgesNovakSolarisTest(
void)
1884 u_char expected[] = {
1916 static int IPV6DefragSturgesNovakSolarisTest(
void)
1919 u_char expected[] = {
1951 static int DefragSturgesNovakFirstTest(
void)
1954 u_char expected[] = {
1986 static int IPV6DefragSturgesNovakFirstTest(
void)
1989 u_char expected[] = {
2021 DefragSturgesNovakLastTest(
void)
2024 u_char expected[] = {
2056 static int IPV6DefragSturgesNovakLastTest(
void)
2059 u_char expected[] = {
2091 static int DefragTimeoutTest(
void)
2101 for (i = 0; i < 16; i++) {
2102 Packet *p = BuildTestPacket(IPPROTO_ICMP,i, 0, 1,
'A' + i, 16);
2112 Packet *p = BuildTestPacket(IPPROTO_ICMP, 99, 0, 1,
'A' + i, 16);
2137 static int DefragIPv4NoDataTest(
void)
2145 dc = DefragContextNew();
2149 p = BuildTestPacket(IPPROTO_ICMP,
id, 1, 0,
'A', 0);
2159 DefragContextDestroy(dc);
2166 static int DefragIPv4TooLargeTest(
void)
2173 dc = DefragContextNew();
2178 p = BuildTestPacket(IPPROTO_ICMP, 1, 8183, 0,
'A', 71);
2191 DefragContextDestroy(dc);
2203 static int DefragVlanTest(
void)
2205 Packet *p1 = NULL, *p2 = NULL, *r = NULL;
2209 p1 = BuildTestPacket(IPPROTO_ICMP, 1, 0, 1,
'A', 8);
2211 p2 = BuildTestPacket(IPPROTO_ICMP, 1, 1, 0,
'B', 8);
2235 static int DefragVlanQinQTest(
void)
2237 Packet *p1 = NULL, *p2 = NULL, *r = NULL;
2241 p1 = BuildTestPacket(IPPROTO_ICMP, 1, 0, 1,
'A', 8);
2243 p2 = BuildTestPacket(IPPROTO_ICMP, 1, 1, 0,
'B', 8);
2269 static int DefragVlanQinQinQTest(
void)
2275 Packet *p1 = BuildTestPacket(IPPROTO_ICMP, 1, 0, 1,
'A', 8);
2277 Packet *p2 = BuildTestPacket(IPPROTO_ICMP, 1, 1, 0,
'B', 8);
2301 static int DefragTrackerReuseTest(
void)
2311 p1 = BuildTestPacket(IPPROTO_ICMP,
id, 0, 0,
'A', 8);
2315 tracker1 = DefragGetTracker(NULL, NULL, p1);
2322 tracker2 = DefragGetTracker(NULL, NULL, p1);
2324 FAIL_IF(tracker2 != tracker1);
2332 tracker2 = DefragGetTracker(NULL, NULL, p1);
2334 FAIL_IF(tracker2 == tracker1);
2351 static int DefragMfIpv4Test(
void)
2358 Packet *p1 = BuildTestPacket(IPPROTO_ICMP, ip_id, 2, 1,
'C', 8);
2359 Packet *p2 = BuildTestPacket(IPPROTO_ICMP, ip_id, 0, 1,
'A', 8);
2360 Packet *p3 = BuildTestPacket(IPPROTO_ICMP, ip_id, 1, 0,
'B', 8);
2361 FAIL_IF(p1 == NULL || p2 == NULL || p3 == NULL);
2363 p =
Defrag(NULL, NULL, p1);
2366 p =
Defrag(NULL, NULL, p2);
2370 p =
Defrag(NULL, NULL, p3);
2394 static int DefragMfIpv6Test(
void)
2401 Packet *p1 = IPV6BuildTestPacket(IPPROTO_ICMPV6, ip_id, 2, 1,
'C', 8);
2402 Packet *p2 = IPV6BuildTestPacket(IPPROTO_ICMPV6, ip_id, 0, 1,
'A', 8);
2403 Packet *p3 = IPV6BuildTestPacket(IPPROTO_ICMPV6, ip_id, 1, 0,
'B', 8);
2404 FAIL_IF(p1 == NULL || p2 == NULL || p3 == NULL);
2406 p =
Defrag(NULL, NULL, p1);
2409 p =
Defrag(NULL, NULL, p2);
2413 p =
Defrag(NULL, NULL, p3);
2432 static int DefragTestBadProto(
void)
2434 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
2439 p1 = BuildTestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 8);
2441 p2 = BuildTestPacket(IPPROTO_UDP,
id, 1, 1,
'B', 8);
2443 p3 = BuildTestPacket(IPPROTO_ICMP,
id, 2, 0,
'C', 3);
2462 static int DefragTestJeremyLinux(
void)
2464 char expected[] =
"AAAAAAAA"
2485 packets[0] = BuildTestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 24);
2486 packets[1] = BuildTestPacket(IPPROTO_ICMP,
id, 40 >> 3, 1,
'B', 48);
2487 packets[2] = BuildTestPacket(IPPROTO_ICMP,
id, 24 >> 3, 1,
'C', 48);
2488 packets[3] = BuildTestPacket(IPPROTO_ICMP,
id, 88 >> 3, 0,
'D', 14);
2493 r =
Defrag(NULL, NULL, packets[1]);
2496 r =
Defrag(NULL, NULL, packets[2]);
2499 r =
Defrag(NULL, NULL, packets[3]);
2504 for (i = 0; i < 4; i++) {
2518 UtRegisterTest(
"DefragInOrderSimpleTest", DefragInOrderSimpleTest);
2519 UtRegisterTest(
"DefragReverseSimpleTest", DefragReverseSimpleTest);
2520 UtRegisterTest(
"DefragSturgesNovakBsdTest", DefragSturgesNovakBsdTest);
2522 DefragSturgesNovakLinuxIpv4Test);
2524 DefragSturgesNovakWindowsIpv4Test);
2526 DefragSturgesNovakSolarisTest);
2527 UtRegisterTest(
"DefragSturgesNovakFirstTest", DefragSturgesNovakFirstTest);
2528 UtRegisterTest(
"DefragSturgesNovakLastTest", DefragSturgesNovakLastTest);
2531 UtRegisterTest(
"DefragIPv4TooLargeTest", DefragIPv4TooLargeTest);
2533 UtRegisterTest(
"IPV6DefragInOrderSimpleTest", IPV6DefragInOrderSimpleTest);
2534 UtRegisterTest(
"IPV6DefragReverseSimpleTest", IPV6DefragReverseSimpleTest);
2536 IPV6DefragSturgesNovakBsdTest);
2538 IPV6DefragSturgesNovakLinuxTest);
2540 IPV6DefragSturgesNovakWindowsTest);
2542 IPV6DefragSturgesNovakSolarisTest);
2544 IPV6DefragSturgesNovakFirstTest);
2546 IPV6DefragSturgesNovakLastTest);
2551 UtRegisterTest(
"DefragTrackerReuseTest", DefragTrackerReuseTest);