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;
292 int fragmentable_offset = 0;
293 uint16_t fragmentable_len = 0;
295 int ip_hdr_offset = 0;
298 SCLogDebug(
"frag %p, data_len %u, offset %u, pcap_cnt %"PRIu64,
308 goto error_remove_tracker;
320 int pkt_end = fragmentable_offset + frag->
offset + frag->
data_len;
323 "fragmented packet, exceeds size of packet buffer.");
324 goto error_remove_tracker;
330 goto error_remove_tracker;
334 "fragmentable_len exceeds UINT16_MAX");
335 goto error_remove_tracker;
346 SCLogDebug(
"ip_hdr_offset %u, hlen %" PRIu16
", fragmentable_len %" PRIu16, ip_hdr_offset, hlen,
352 rp->
ip4h->
ip_len = htons(fragmentable_len + hlen);
356 SET_PKT_LEN(rp, ip_hdr_offset + hlen + fragmentable_len);
363 error_remove_tracker:
389 }
else if (first->
offset != 0) {
394 goto error_remove_tracker;
429 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) {
885 else if (tracker->
af == AF_INET6) {
886 r = Defrag6Reassemble(
tv, tracker, p);
887 if (r != NULL &&
tv != NULL &&
dtv != NULL) {
935 return default_policy;
978 return default_policy;
1004 uint16_t frag_offset;
1023 if (frag_offset == 0 && more_frags == 0) {
1027 if (
tv != NULL &&
dtv != NULL) {
1028 if (
af == AF_INET) {
1031 else if (
af == AF_INET6) {
1037 tracker = DefragGetTracker(
tv,
dtv, p);
1038 if (tracker == NULL) {
1039 if (
tv != NULL &&
dtv != NULL) {
1045 Packet *rp = DefragInsertFrag(
tv,
dtv, tracker, p);
1054 intmax_t tracker_pool_size;
1055 if (!
ConfGetInt(
"defrag.trackers", &tracker_pool_size)) {
1063 defrag_context = DefragContextNew();
1064 if (defrag_context == NULL) {
1065 FatalError(
"Failed to allocate memory for the Defrag module.");
1075 DefragContextDestroy(defrag_context);
1076 defrag_context = NULL;
1084 #define IP_MF 0x2000
1090 static Packet *BuildTestPacket(uint8_t
proto, uint16_t
id, uint16_t off,
int mf,
1091 const char content,
int content_len)
1105 struct timeval tval;
1106 gettimeofday(&tval, NULL);
1111 ip4h.
ip_len = htons(hlen + content_len);
1112 ip4h.
ip_id = htons(
id);
1116 ip4h.
ip_off = htons(off);
1120 ip4h.s_ip_src.s_addr = 0x01010101;
1121 ip4h.s_ip_dst.s_addr = 0x02020202;
1129 pcontent =
SCCalloc(1, content_len);
1132 memset(pcontent, content, content_len);
1164 static Packet *IPV6BuildTestPacket(uint8_t
proto, uint32_t
id, uint16_t off,
1165 int mf,
const char content,
int content_len)
1177 struct timeval tval;
1178 gettimeofday(&tval, NULL);
1181 ip6h.s_ip6_nxt = 44;
1182 ip6h.s_ip6_hlim = 2;
1185 ip6h.s_ip6_src[0] = 0x01010101;
1186 ip6h.s_ip6_src[1] = 0x01010101;
1187 ip6h.s_ip6_src[2] = 0x01010101;
1188 ip6h.s_ip6_src[3] = 0x01010101;
1189 ip6h.s_ip6_dst[0] = 0x02020202;
1190 ip6h.s_ip6_dst[1] = 0x02020202;
1191 ip6h.s_ip6_dst[2] = 0x02020202;
1192 ip6h.s_ip6_dst[3] = 0x02020202;
1201 fh->ip6fh_nxt =
proto;
1202 fh->ip6fh_ident = htonl(
id);
1203 fh->ip6fh_offlg = htons((off << 3) | mf);
1207 pcontent =
SCCalloc(1, content_len);
1210 memset(pcontent, content, content_len);
1215 p->
ip6h->s_ip6_plen = htons(
sizeof(IPV6FragHdr) + content_len);
1239 static int DefragInOrderSimpleTest(
void)
1241 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1242 Packet *reassembled = NULL;
1248 p1 = BuildTestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 8);
1250 p2 = BuildTestPacket(IPPROTO_ICMP,
id, 1, 1,
'B', 8);
1252 p3 = BuildTestPacket(IPPROTO_ICMP,
id, 2, 0,
'C', 3);
1258 reassembled =
Defrag(NULL, NULL, p3);
1265 for (i = 20; i < 20 + 8; i++) {
1270 for (i = 28; i < 28 + 8; i++) {
1275 for (i = 36; i < 36 + 3; i++) {
1291 static int DefragReverseSimpleTest(
void)
1293 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1294 Packet *reassembled = NULL;
1300 p1 = BuildTestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 8);
1302 p2 = BuildTestPacket(IPPROTO_ICMP,
id, 1, 1,
'B', 8);
1304 p3 = BuildTestPacket(IPPROTO_ICMP,
id, 2, 0,
'C', 3);
1310 reassembled =
Defrag(NULL, NULL, p1);
1317 for (i = 20; i < 20 + 8; i++) {
1322 for (i = 28; i < 28 + 8; i++) {
1327 for (i = 36; i < 36 + 3; i++) {
1344 static int IPV6DefragInOrderSimpleTest(
void)
1346 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1347 Packet *reassembled = NULL;
1353 p1 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 0, 1,
'A', 8);
1355 p2 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 1, 1,
'B', 8);
1357 p3 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 2, 0,
'C', 3);
1362 reassembled =
Defrag(NULL, NULL, p3);
1368 for (i = 40; i < 40 + 8; i++) {
1373 for (i = 48; i < 48 + 8; i++) {
1378 for (i = 56; i < 56 + 3; i++) {
1391 static int IPV6DefragReverseSimpleTest(
void)
1394 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1395 Packet *reassembled = NULL;
1401 dc = DefragContextNew();
1404 p1 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 0, 1,
'A', 8);
1406 p2 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 1, 1,
'B', 8);
1408 p3 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 2, 0,
'C', 3);
1413 reassembled =
Defrag(NULL, NULL, p1);
1417 for (i = 40; i < 40 + 8; i++) {
1422 for (i = 48; i < 48 + 8; i++) {
1427 for (i = 56; i < 56 + 3; i++) {
1431 DefragContextDestroy(dc);
1441 static int DefragDoSturgesNovakTest(
int policy, u_char *expected,
1442 size_t expected_len)
1454 memset(packets, 0x00,
sizeof(packets));
1461 packets[0] = BuildTestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 24);
1464 packets[1] = BuildTestPacket(IPPROTO_ICMP,
id, 32 >> 3, 1,
'B', 16);
1467 packets[2] = BuildTestPacket(IPPROTO_ICMP,
id, 48 >> 3, 1,
'C', 24);
1470 packets[3] = BuildTestPacket(IPPROTO_ICMP,
id, 80 >> 3, 1,
'D', 8);
1473 packets[4] = BuildTestPacket(IPPROTO_ICMP,
id, 104 >> 3, 1,
'E', 16);
1476 packets[5] = BuildTestPacket(IPPROTO_ICMP,
id, 120 >> 3, 1,
'F', 24);
1479 packets[6] = BuildTestPacket(IPPROTO_ICMP,
id, 144 >> 3, 1,
'G', 16);
1482 packets[7] = BuildTestPacket(IPPROTO_ICMP,
id, 160 >> 3, 1,
'H', 16);
1485 packets[8] = BuildTestPacket(IPPROTO_ICMP,
id, 176 >> 3, 1,
'I', 8);
1492 packets[9] = BuildTestPacket(IPPROTO_ICMP,
id, 8 >> 3, 1,
'J', 32);
1495 packets[10] = BuildTestPacket(IPPROTO_ICMP,
id, 48 >> 3, 1,
'K', 24);
1498 packets[11] = BuildTestPacket(IPPROTO_ICMP,
id, 72 >> 3, 1,
'L', 24);
1501 packets[12] = BuildTestPacket(IPPROTO_ICMP,
id, 96 >> 3, 1,
'M', 24);
1504 packets[13] = BuildTestPacket(IPPROTO_ICMP,
id, 128 >> 3, 1,
'N', 8);
1507 packets[14] = BuildTestPacket(IPPROTO_ICMP,
id, 152 >> 3, 1,
'O', 8);
1510 packets[15] = BuildTestPacket(IPPROTO_ICMP,
id, 160 >> 3, 1,
'P', 8);
1513 packets[16] = BuildTestPacket(IPPROTO_ICMP,
id, 176 >> 3, 0,
'Q', 16);
1515 default_policy = policy;
1518 for (i = 0; i < 9; i++) {
1524 for (; i < 16; i++) {
1546 for (i = 0; i < 17; i++) {
1553 static int IPV6DefragDoSturgesNovakTest(
int policy, u_char *expected,
1554 size_t expected_len)
1566 memset(packets, 0x00,
sizeof(packets));
1573 packets[0] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 0, 1,
'A', 24);
1576 packets[1] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 32 >> 3, 1,
'B', 16);
1579 packets[2] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 48 >> 3, 1,
'C', 24);
1582 packets[3] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 80 >> 3, 1,
'D', 8);
1585 packets[4] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 104 >> 3, 1,
'E', 16);
1588 packets[5] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 120 >> 3, 1,
'F', 24);
1591 packets[6] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 144 >> 3, 1,
'G', 16);
1594 packets[7] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 160 >> 3, 1,
'H', 16);
1597 packets[8] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 176 >> 3, 1,
'I', 8);
1604 packets[9] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 8 >> 3, 1,
'J', 32);
1607 packets[10] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 48 >> 3, 1,
'K', 24);
1610 packets[11] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 72 >> 3, 1,
'L', 24);
1613 packets[12] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 96 >> 3, 1,
'M', 24);
1616 packets[13] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 128 >> 3, 1,
'N', 8);
1619 packets[14] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 152 >> 3, 1,
'O', 8);
1622 packets[15] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 160 >> 3, 1,
'P', 8);
1625 packets[16] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 176 >> 3, 0,
'Q', 16);
1627 default_policy = policy;
1630 for (i = 0; i < 9; i++) {
1636 for (; i < 16; i++) {
1657 for (i = 0; i < 17; i++) {
1665 DefragSturgesNovakBsdTest(
void)
1668 u_char expected[] = {
1700 static int IPV6DefragSturgesNovakBsdTest(
void)
1703 u_char expected[] = {
1735 static int DefragSturgesNovakLinuxIpv4Test(
void)
1738 u_char expected[] = {
1770 static int IPV6DefragSturgesNovakLinuxTest(
void)
1773 u_char expected[] = {
1805 static int DefragSturgesNovakWindowsIpv4Test(
void)
1808 u_char expected[] = {
1840 static int IPV6DefragSturgesNovakWindowsTest(
void)
1843 u_char expected[] = {
1875 static int DefragSturgesNovakSolarisTest(
void)
1878 u_char expected[] = {
1910 static int IPV6DefragSturgesNovakSolarisTest(
void)
1913 u_char expected[] = {
1945 static int DefragSturgesNovakFirstTest(
void)
1948 u_char expected[] = {
1980 static int IPV6DefragSturgesNovakFirstTest(
void)
1983 u_char expected[] = {
2015 DefragSturgesNovakLastTest(
void)
2018 u_char expected[] = {
2050 static int IPV6DefragSturgesNovakLastTest(
void)
2053 u_char expected[] = {
2085 static int DefragTimeoutTest(
void)
2095 for (i = 0; i < 16; i++) {
2096 Packet *p = BuildTestPacket(IPPROTO_ICMP,i, 0, 1,
'A' + i, 16);
2106 Packet *p = BuildTestPacket(IPPROTO_ICMP, 99, 0, 1,
'A' + i, 16);
2131 static int DefragIPv4NoDataTest(
void)
2139 dc = DefragContextNew();
2143 p = BuildTestPacket(IPPROTO_ICMP,
id, 1, 0,
'A', 0);
2153 DefragContextDestroy(dc);
2160 static int DefragIPv4TooLargeTest(
void)
2167 dc = DefragContextNew();
2172 p = BuildTestPacket(IPPROTO_ICMP, 1, 8183, 0,
'A', 71);
2185 DefragContextDestroy(dc);
2197 static int DefragVlanTest(
void)
2199 Packet *p1 = NULL, *p2 = NULL, *r = NULL;
2203 p1 = BuildTestPacket(IPPROTO_ICMP, 1, 0, 1,
'A', 8);
2205 p2 = BuildTestPacket(IPPROTO_ICMP, 1, 1, 0,
'B', 8);
2229 static int DefragVlanQinQTest(
void)
2231 Packet *p1 = NULL, *p2 = NULL, *r = NULL;
2235 p1 = BuildTestPacket(IPPROTO_ICMP, 1, 0, 1,
'A', 8);
2237 p2 = BuildTestPacket(IPPROTO_ICMP, 1, 1, 0,
'B', 8);
2263 static int DefragVlanQinQinQTest(
void)
2269 Packet *p1 = BuildTestPacket(IPPROTO_ICMP, 1, 0, 1,
'A', 8);
2271 Packet *p2 = BuildTestPacket(IPPROTO_ICMP, 1, 1, 0,
'B', 8);
2295 static int DefragTrackerReuseTest(
void)
2305 p1 = BuildTestPacket(IPPROTO_ICMP,
id, 0, 0,
'A', 8);
2309 tracker1 = DefragGetTracker(NULL, NULL, p1);
2316 tracker2 = DefragGetTracker(NULL, NULL, p1);
2318 FAIL_IF(tracker2 != tracker1);
2326 tracker2 = DefragGetTracker(NULL, NULL, p1);
2328 FAIL_IF(tracker2 == tracker1);
2345 static int DefragMfIpv4Test(
void)
2352 Packet *p1 = BuildTestPacket(IPPROTO_ICMP, ip_id, 2, 1,
'C', 8);
2353 Packet *p2 = BuildTestPacket(IPPROTO_ICMP, ip_id, 0, 1,
'A', 8);
2354 Packet *p3 = BuildTestPacket(IPPROTO_ICMP, ip_id, 1, 0,
'B', 8);
2355 FAIL_IF(p1 == NULL || p2 == NULL || p3 == NULL);
2357 p =
Defrag(NULL, NULL, p1);
2360 p =
Defrag(NULL, NULL, p2);
2364 p =
Defrag(NULL, NULL, p3);
2388 static int DefragMfIpv6Test(
void)
2395 Packet *p1 = IPV6BuildTestPacket(IPPROTO_ICMPV6, ip_id, 2, 1,
'C', 8);
2396 Packet *p2 = IPV6BuildTestPacket(IPPROTO_ICMPV6, ip_id, 0, 1,
'A', 8);
2397 Packet *p3 = IPV6BuildTestPacket(IPPROTO_ICMPV6, ip_id, 1, 0,
'B', 8);
2398 FAIL_IF(p1 == NULL || p2 == NULL || p3 == NULL);
2400 p =
Defrag(NULL, NULL, p1);
2403 p =
Defrag(NULL, NULL, p2);
2407 p =
Defrag(NULL, NULL, p3);
2426 static int DefragTestBadProto(
void)
2428 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
2433 p1 = BuildTestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 8);
2435 p2 = BuildTestPacket(IPPROTO_UDP,
id, 1, 1,
'B', 8);
2437 p3 = BuildTestPacket(IPPROTO_ICMP,
id, 2, 0,
'C', 3);
2456 static int DefragTestJeremyLinux(
void)
2458 char expected[] =
"AAAAAAAA"
2479 packets[0] = BuildTestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 24);
2480 packets[1] = BuildTestPacket(IPPROTO_ICMP,
id, 40 >> 3, 1,
'B', 48);
2481 packets[2] = BuildTestPacket(IPPROTO_ICMP,
id, 24 >> 3, 1,
'C', 48);
2482 packets[3] = BuildTestPacket(IPPROTO_ICMP,
id, 88 >> 3, 0,
'D', 14);
2487 r =
Defrag(NULL, NULL, packets[1]);
2490 r =
Defrag(NULL, NULL, packets[2]);
2493 r =
Defrag(NULL, NULL, packets[3]);
2498 for (i = 0; i < 4; i++) {
2512 UtRegisterTest(
"DefragInOrderSimpleTest", DefragInOrderSimpleTest);
2513 UtRegisterTest(
"DefragReverseSimpleTest", DefragReverseSimpleTest);
2514 UtRegisterTest(
"DefragSturgesNovakBsdTest", DefragSturgesNovakBsdTest);
2516 DefragSturgesNovakLinuxIpv4Test);
2518 DefragSturgesNovakWindowsIpv4Test);
2520 DefragSturgesNovakSolarisTest);
2521 UtRegisterTest(
"DefragSturgesNovakFirstTest", DefragSturgesNovakFirstTest);
2522 UtRegisterTest(
"DefragSturgesNovakLastTest", DefragSturgesNovakLastTest);
2525 UtRegisterTest(
"DefragIPv4TooLargeTest", DefragIPv4TooLargeTest);
2527 UtRegisterTest(
"IPV6DefragInOrderSimpleTest", IPV6DefragInOrderSimpleTest);
2528 UtRegisterTest(
"IPV6DefragReverseSimpleTest", IPV6DefragReverseSimpleTest);
2530 IPV6DefragSturgesNovakBsdTest);
2532 IPV6DefragSturgesNovakLinuxTest);
2534 IPV6DefragSturgesNovakWindowsTest);
2536 IPV6DefragSturgesNovakSolarisTest);
2538 IPV6DefragSturgesNovakFirstTest);
2540 IPV6DefragSturgesNovakLastTest);
2545 UtRegisterTest(
"DefragTrackerReuseTest", DefragTrackerReuseTest);