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;
436 uint16_t unfragmentable_len = 0;
437 int fragmentable_offset = 0;
438 uint16_t fragmentable_len = 0;
439 int ip_hdr_offset = 0;
440 uint8_t next_hdr = 0;
447 IPV6FragHdr *frag_hdr = (IPV6FragHdr *)(frag->
pkt +
449 next_hdr = frag_hdr->ip6fh_nxt;
455 goto error_remove_tracker;
459 goto error_remove_tracker;
473 unfragmentable_len = (uint16_t)(fragmentable_offset - ip_hdr_offset -
IPV6_HEADER_LEN);
474 if (unfragmentable_len >= fragmentable_offset)
475 goto error_remove_tracker;
481 goto error_remove_tracker;
493 rp->
ip6h->s_ip6_plen = htons(fragmentable_len + unfragmentable_len);
498 if (unfragmentable_len == 0)
499 rp->
ip6h->s_ip6_nxt = next_hdr;
501 unfragmentable_len + fragmentable_len);
508 error_remove_tracker:
542 uint16_t frag_offset;
549 uint16_t data_offset;
559 uint16_t ip_hdr_offset;
562 uint16_t frag_hdr_offset = 0;
565 int af = tracker->
af;
569 uint32_t ip6_nh_set_offset = 0;
570 uint8_t ip6_nh_set_value = 0;
576 if (tracker->
af == AF_INET) {
582 frag_end = frag_offset + data_len;
592 else if (tracker->
af == AF_INET6) {
597 frag_end = frag_offset + data_len;
601 SCLogDebug(
"mf %s frag_offset %u data_offset %u, data_len %u, "
602 "frag_end %u, ip_hdr_offset %u, frag_hdr_offset %u",
603 more_frags ?
"true" :
"false", frag_offset, data_offset,
604 data_len, frag_end, ip_hdr_offset, frag_hdr_offset);
608 SCLogDebug(
"we have exthdrs before fraghdr %u bytes",
617 SCLogDebug(
"offset %d, value %u", ip6_nh_set_offset, ip6_nh_set_value);
636 bool overlap =
false;
641 .
offset = frag_offset - 1,
646 next = IP_FRAGMENTS_RB_NEXT(prev);
648 prev = IP_FRAGMENTS_RB_PREV(
next);
651 next = IP_FRAGMENTS_RB_NEXT(prev);
654 while (prev != NULL) {
662 switch (tracker->
policy) {
665 if (frag_offset >= prev->
offset) {
668 if ((
next != NULL) && (frag_end >
next->offset)) {
669 next->ltrim = frag_end -
next->offset;
671 if ((frag_offset < prev->
offset) &&
686 if (prev->
offset + prev->
ltrim < frag_offset + ltrim &&
699 if (frag_offset + ltrim < prev->
offset + prev->
ltrim &&
710 if (frag_offset + ltrim <= prev->
offset + prev->
ltrim &&
719 if (frag_offset + ltrim >= prev->
offset + ltrim &&
726 if (frag_offset + ltrim < prev->
offset + ltrim &&
739 if (frag_offset + ltrim > prev->
offset + prev->
ltrim &&
748 if (frag_offset + ltrim == prev->
offset + ltrim &&
756 if (frag_offset >= prev->
offset) {
759 if ((frag_offset < prev->
offset) &&
767 if ((frag_offset >= prev->
offset) &&
771 if (frag_offset < prev->
offset) {
780 if (frag_offset <= prev->
offset) {
781 if (frag_end > prev->
offset) {
804 DefragFragReset(prev);
813 if (ltrim > data_len) {
832 if (new->pkt == NULL) {
848 if (ip6_nh_set_offset > 0 && frag_offset == 0 && ltrim == 0) {
849 if (new->len > ip6_nh_set_offset) {
850 SCLogDebug(
"updating frag to have 'correct' nh value: %u -> %u",
851 new->pkt[ip6_nh_set_offset], ip6_nh_set_value);
852 new->pkt[ip6_nh_set_offset] = ip6_nh_set_value;
857 new->offset = frag_offset + ltrim;
858 new->data_offset = data_offset;
859 new->data_len = data_len - ltrim;
860 new->ip_hdr_offset = ip_hdr_offset;
861 new->frag_hdr_offset = frag_hdr_offset;
862 new->more_frags = more_frags;
864 new->pcap_cnt = pcap_cnt;
866 if (frag_offset == 0) {
877 if (tracker->
af == AF_INET) {
878 r = Defrag4Reassemble(
tv, tracker, p);
879 if (r != NULL &&
tv != NULL &&
dtv != NULL) {
890 else if (tracker->
af == AF_INET6) {
891 r = Defrag6Reassemble(
tv, tracker, p);
892 if (r != NULL &&
tv != NULL &&
dtv != NULL) {
940 return default_policy;
983 return default_policy;
1009 uint16_t frag_offset;
1028 if (frag_offset == 0 && more_frags == 0) {
1032 if (
tv != NULL &&
dtv != NULL) {
1033 if (
af == AF_INET) {
1036 else if (
af == AF_INET6) {
1042 tracker = DefragGetTracker(
tv,
dtv, p);
1043 if (tracker == NULL) {
1044 if (
tv != NULL &&
dtv != NULL) {
1050 Packet *rp = DefragInsertFrag(
tv,
dtv, tracker, p);
1059 intmax_t tracker_pool_size;
1060 if (!
ConfGetInt(
"defrag.trackers", &tracker_pool_size)) {
1068 defrag_context = DefragContextNew();
1069 if (defrag_context == NULL) {
1070 FatalError(
"Failed to allocate memory for the Defrag module.");
1080 DefragContextDestroy(defrag_context);
1081 defrag_context = NULL;
1089 #define IP_MF 0x2000
1095 static Packet *BuildTestPacket(uint8_t
proto, uint16_t
id, uint16_t off,
int mf,
1096 const char content,
int content_len)
1110 struct timeval tval;
1111 gettimeofday(&tval, NULL);
1116 ip4h.
ip_len = htons(hlen + content_len);
1117 ip4h.
ip_id = htons(
id);
1121 ip4h.
ip_off = htons(off);
1125 ip4h.s_ip_src.s_addr = 0x01010101;
1126 ip4h.s_ip_dst.s_addr = 0x02020202;
1134 pcontent =
SCCalloc(1, content_len);
1137 memset(pcontent, content, content_len);
1169 static Packet *IPV6BuildTestPacket(uint8_t
proto, uint32_t
id, uint16_t off,
1170 int mf,
const char content,
int content_len)
1182 struct timeval tval;
1183 gettimeofday(&tval, NULL);
1186 ip6h.s_ip6_nxt = 44;
1187 ip6h.s_ip6_hlim = 2;
1190 ip6h.s_ip6_src[0] = 0x01010101;
1191 ip6h.s_ip6_src[1] = 0x01010101;
1192 ip6h.s_ip6_src[2] = 0x01010101;
1193 ip6h.s_ip6_src[3] = 0x01010101;
1194 ip6h.s_ip6_dst[0] = 0x02020202;
1195 ip6h.s_ip6_dst[1] = 0x02020202;
1196 ip6h.s_ip6_dst[2] = 0x02020202;
1197 ip6h.s_ip6_dst[3] = 0x02020202;
1206 fh->ip6fh_nxt =
proto;
1207 fh->ip6fh_ident = htonl(
id);
1208 fh->ip6fh_offlg = htons((off << 3) | mf);
1212 pcontent =
SCCalloc(1, content_len);
1215 memset(pcontent, content, content_len);
1220 p->
ip6h->s_ip6_plen = htons(
sizeof(IPV6FragHdr) + content_len);
1244 static int DefragInOrderSimpleTest(
void)
1246 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1247 Packet *reassembled = NULL;
1250 memset(&
tv, 0,
sizeof(
tv));
1252 memset(&
dtv, 0,
sizeof(
dtv));
1256 p1 = BuildTestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 8);
1258 p2 = BuildTestPacket(IPPROTO_ICMP,
id, 1, 1,
'B', 8);
1260 p3 = BuildTestPacket(IPPROTO_ICMP,
id, 2, 0,
'C', 3);
1273 for (
int i = 20; i < 20 + 8; i++) {
1278 for (
int i = 28; i < 28 + 8; i++) {
1283 for (
int i = 36; i < 36 + 3; i++) {
1299 static int DefragReverseSimpleTest(
void)
1301 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1302 Packet *reassembled = NULL;
1305 memset(&
tv, 0,
sizeof(
tv));
1307 memset(&
dtv, 0,
sizeof(
dtv));
1311 p1 = BuildTestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 8);
1313 p2 = BuildTestPacket(IPPROTO_ICMP,
id, 1, 1,
'B', 8);
1315 p3 = BuildTestPacket(IPPROTO_ICMP,
id, 2, 0,
'C', 3);
1327 for (
int i = 20; i < 20 + 8; i++) {
1332 for (
int i = 28; i < 28 + 8; i++) {
1337 for (
int i = 36; i < 36 + 3; i++) {
1354 static int IPV6DefragInOrderSimpleTest(
void)
1356 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1357 Packet *reassembled = NULL;
1360 memset(&
tv, 0,
sizeof(
tv));
1362 memset(&
dtv, 0,
sizeof(
dtv));
1366 p1 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 0, 1,
'A', 8);
1368 p2 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 1, 1,
'B', 8);
1370 p3 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 2, 0,
'C', 3);
1381 for (
int i = 40; i < 40 + 8; i++) {
1386 for (
int i = 48; i < 48 + 8; i++) {
1391 for (
int i = 56; i < 56 + 3; i++) {
1404 static int IPV6DefragReverseSimpleTest(
void)
1407 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1408 Packet *reassembled = NULL;
1411 memset(&
tv, 0,
sizeof(
tv));
1413 memset(&
dtv, 0,
sizeof(
dtv));
1417 dc = DefragContextNew();
1420 p1 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 0, 1,
'A', 8);
1422 p2 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 1, 1,
'B', 8);
1424 p3 = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 2, 0,
'C', 3);
1433 for (
int i = 40; i < 40 + 8; i++) {
1438 for (
int i = 48; i < 48 + 8; i++) {
1443 for (
int i = 56; i < 56 + 3; i++) {
1447 DefragContextDestroy(dc);
1457 static int DefragDoSturgesNovakTest(
int policy, u_char *expected,
1458 size_t expected_len)
1462 memset(&
tv, 0,
sizeof(
tv));
1464 memset(&
dtv, 0,
sizeof(
dtv));
1474 memset(packets, 0x00,
sizeof(packets));
1481 packets[0] = BuildTestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 24);
1484 packets[1] = BuildTestPacket(IPPROTO_ICMP,
id, 32 >> 3, 1,
'B', 16);
1487 packets[2] = BuildTestPacket(IPPROTO_ICMP,
id, 48 >> 3, 1,
'C', 24);
1490 packets[3] = BuildTestPacket(IPPROTO_ICMP,
id, 80 >> 3, 1,
'D', 8);
1493 packets[4] = BuildTestPacket(IPPROTO_ICMP,
id, 104 >> 3, 1,
'E', 16);
1496 packets[5] = BuildTestPacket(IPPROTO_ICMP,
id, 120 >> 3, 1,
'F', 24);
1499 packets[6] = BuildTestPacket(IPPROTO_ICMP,
id, 144 >> 3, 1,
'G', 16);
1502 packets[7] = BuildTestPacket(IPPROTO_ICMP,
id, 160 >> 3, 1,
'H', 16);
1505 packets[8] = BuildTestPacket(IPPROTO_ICMP,
id, 176 >> 3, 1,
'I', 8);
1512 packets[9] = BuildTestPacket(IPPROTO_ICMP,
id, 8 >> 3, 1,
'J', 32);
1515 packets[10] = BuildTestPacket(IPPROTO_ICMP,
id, 48 >> 3, 1,
'K', 24);
1518 packets[11] = BuildTestPacket(IPPROTO_ICMP,
id, 72 >> 3, 1,
'L', 24);
1521 packets[12] = BuildTestPacket(IPPROTO_ICMP,
id, 96 >> 3, 1,
'M', 24);
1524 packets[13] = BuildTestPacket(IPPROTO_ICMP,
id, 128 >> 3, 1,
'N', 8);
1527 packets[14] = BuildTestPacket(IPPROTO_ICMP,
id, 152 >> 3, 1,
'O', 8);
1530 packets[15] = BuildTestPacket(IPPROTO_ICMP,
id, 160 >> 3, 1,
'P', 8);
1533 packets[16] = BuildTestPacket(IPPROTO_ICMP,
id, 176 >> 3, 0,
'Q', 16);
1535 default_policy = policy;
1538 for (i = 0; i < 9; i++) {
1544 for (; i < 16; i++) {
1566 for (i = 0; i < 17; i++) {
1573 static int IPV6DefragDoSturgesNovakTest(
int policy, u_char *expected,
1574 size_t expected_len)
1578 memset(&
tv, 0,
sizeof(
tv));
1580 memset(&
dtv, 0,
sizeof(
dtv));
1590 memset(packets, 0x00,
sizeof(packets));
1597 packets[0] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 0, 1,
'A', 24);
1600 packets[1] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 32 >> 3, 1,
'B', 16);
1603 packets[2] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 48 >> 3, 1,
'C', 24);
1606 packets[3] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 80 >> 3, 1,
'D', 8);
1609 packets[4] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 104 >> 3, 1,
'E', 16);
1612 packets[5] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 120 >> 3, 1,
'F', 24);
1615 packets[6] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 144 >> 3, 1,
'G', 16);
1618 packets[7] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 160 >> 3, 1,
'H', 16);
1621 packets[8] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 176 >> 3, 1,
'I', 8);
1628 packets[9] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 8 >> 3, 1,
'J', 32);
1631 packets[10] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 48 >> 3, 1,
'K', 24);
1634 packets[11] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 72 >> 3, 1,
'L', 24);
1637 packets[12] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 96 >> 3, 1,
'M', 24);
1640 packets[13] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 128 >> 3, 1,
'N', 8);
1643 packets[14] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 152 >> 3, 1,
'O', 8);
1646 packets[15] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 160 >> 3, 1,
'P', 8);
1649 packets[16] = IPV6BuildTestPacket(IPPROTO_ICMPV6,
id, 176 >> 3, 0,
'Q', 16);
1651 default_policy = policy;
1654 for (i = 0; i < 9; i++) {
1660 for (; i < 16; i++) {
1681 for (i = 0; i < 17; i++) {
1689 DefragSturgesNovakBsdTest(
void)
1692 u_char expected[] = {
1724 static int IPV6DefragSturgesNovakBsdTest(
void)
1727 u_char expected[] = {
1759 static int DefragSturgesNovakLinuxIpv4Test(
void)
1762 u_char expected[] = {
1794 static int IPV6DefragSturgesNovakLinuxTest(
void)
1797 u_char expected[] = {
1829 static int DefragSturgesNovakWindowsIpv4Test(
void)
1832 u_char expected[] = {
1864 static int IPV6DefragSturgesNovakWindowsTest(
void)
1867 u_char expected[] = {
1899 static int DefragSturgesNovakSolarisTest(
void)
1902 u_char expected[] = {
1934 static int IPV6DefragSturgesNovakSolarisTest(
void)
1937 u_char expected[] = {
1969 static int DefragSturgesNovakFirstTest(
void)
1972 u_char expected[] = {
2004 static int IPV6DefragSturgesNovakFirstTest(
void)
2007 u_char expected[] = {
2039 DefragSturgesNovakLastTest(
void)
2042 u_char expected[] = {
2074 static int IPV6DefragSturgesNovakLastTest(
void)
2077 u_char expected[] = {
2109 static int DefragTimeoutTest(
void)
2113 memset(&
tv, 0,
sizeof(
tv));
2115 memset(&
dtv, 0,
sizeof(
dtv));
2123 for (i = 0; i < 16; i++) {
2124 Packet *p = BuildTestPacket(IPPROTO_ICMP,i, 0, 1,
'A' + i, 16);
2134 Packet *p = BuildTestPacket(IPPROTO_ICMP, 99, 0, 1,
'A' + i, 16);
2159 static int DefragIPv4NoDataTest(
void)
2165 memset(&
tv, 0,
sizeof(
tv));
2167 memset(&
dtv, 0,
sizeof(
dtv));
2171 dc = DefragContextNew();
2175 p = BuildTestPacket(IPPROTO_ICMP,
id, 1, 0,
'A', 0);
2185 DefragContextDestroy(dc);
2192 static int DefragIPv4TooLargeTest(
void)
2197 memset(&
tv, 0,
sizeof(
tv));
2199 memset(&
dtv, 0,
sizeof(
dtv));
2203 dc = DefragContextNew();
2208 p = BuildTestPacket(IPPROTO_ICMP, 1, 8183, 0,
'A', 71);
2221 DefragContextDestroy(dc);
2233 static int DefragVlanTest(
void)
2235 Packet *p1 = NULL, *p2 = NULL, *r = NULL;
2237 memset(&
tv, 0,
sizeof(
tv));
2239 memset(&
dtv, 0,
sizeof(
dtv));
2243 p1 = BuildTestPacket(IPPROTO_ICMP, 1, 0, 1,
'A', 8);
2245 p2 = BuildTestPacket(IPPROTO_ICMP, 1, 1, 0,
'B', 8);
2269 static int DefragVlanQinQTest(
void)
2271 Packet *p1 = NULL, *p2 = NULL, *r = NULL;
2273 memset(&
tv, 0,
sizeof(
tv));
2275 memset(&
dtv, 0,
sizeof(
dtv));
2279 p1 = BuildTestPacket(IPPROTO_ICMP, 1, 0, 1,
'A', 8);
2281 p2 = BuildTestPacket(IPPROTO_ICMP, 1, 1, 0,
'B', 8);
2307 static int DefragVlanQinQinQTest(
void)
2311 memset(&
tv, 0,
sizeof(
tv));
2313 memset(&
dtv, 0,
sizeof(
dtv));
2317 Packet *p1 = BuildTestPacket(IPPROTO_ICMP, 1, 0, 1,
'A', 8);
2319 Packet *p2 = BuildTestPacket(IPPROTO_ICMP, 1, 1, 0,
'B', 8);
2343 static int DefragTrackerReuseTest(
void)
2349 memset(&
tv, 0,
sizeof(
tv));
2351 memset(&
dtv, 0,
sizeof(
dtv));
2357 p1 = BuildTestPacket(IPPROTO_ICMP,
id, 0, 0,
'A', 8);
2361 tracker1 = DefragGetTracker(NULL, NULL, p1);
2368 tracker2 = DefragGetTracker(NULL, NULL, p1);
2370 FAIL_IF(tracker2 != tracker1);
2378 tracker2 = DefragGetTracker(NULL, NULL, p1);
2380 FAIL_IF(tracker2 == tracker1);
2397 static int DefragMfIpv4Test(
void)
2402 memset(&
tv, 0,
sizeof(
tv));
2404 memset(&
dtv, 0,
sizeof(
dtv));
2408 Packet *p1 = BuildTestPacket(IPPROTO_ICMP, ip_id, 2, 1,
'C', 8);
2409 Packet *p2 = BuildTestPacket(IPPROTO_ICMP, ip_id, 0, 1,
'A', 8);
2410 Packet *p3 = BuildTestPacket(IPPROTO_ICMP, ip_id, 1, 0,
'B', 8);
2411 FAIL_IF(p1 == NULL || p2 == NULL || p3 == NULL);
2444 static int DefragMfIpv6Test(
void)
2449 memset(&
tv, 0,
sizeof(
tv));
2451 memset(&
dtv, 0,
sizeof(
dtv));
2455 Packet *p1 = IPV6BuildTestPacket(IPPROTO_ICMPV6, ip_id, 2, 1,
'C', 8);
2456 Packet *p2 = IPV6BuildTestPacket(IPPROTO_ICMPV6, ip_id, 0, 1,
'A', 8);
2457 Packet *p3 = IPV6BuildTestPacket(IPPROTO_ICMPV6, ip_id, 1, 0,
'B', 8);
2458 FAIL_IF(p1 == NULL || p2 == NULL || p3 == NULL);
2486 static int DefragTestBadProto(
void)
2488 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
2491 memset(&
tv, 0,
sizeof(
tv));
2493 memset(&
dtv, 0,
sizeof(
dtv));
2497 p1 = BuildTestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 8);
2499 p2 = BuildTestPacket(IPPROTO_UDP,
id, 1, 1,
'B', 8);
2501 p3 = BuildTestPacket(IPPROTO_ICMP,
id, 2, 0,
'C', 3);
2520 static int DefragTestJeremyLinux(
void)
2523 memset(&
tv, 0,
sizeof(
tv));
2525 memset(&
dtv, 0,
sizeof(
dtv));
2526 char expected[] =
"AAAAAAAA"
2547 packets[0] = BuildTestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 24);
2548 packets[1] = BuildTestPacket(IPPROTO_ICMP,
id, 40 >> 3, 1,
'B', 48);
2549 packets[2] = BuildTestPacket(IPPROTO_ICMP,
id, 24 >> 3, 1,
'C', 48);
2550 packets[3] = BuildTestPacket(IPPROTO_ICMP,
id, 88 >> 3, 0,
'D', 14);
2566 for (i = 0; i < 4; i++) {
2580 UtRegisterTest(
"DefragInOrderSimpleTest", DefragInOrderSimpleTest);
2581 UtRegisterTest(
"DefragReverseSimpleTest", DefragReverseSimpleTest);
2582 UtRegisterTest(
"DefragSturgesNovakBsdTest", DefragSturgesNovakBsdTest);
2584 DefragSturgesNovakLinuxIpv4Test);
2586 DefragSturgesNovakWindowsIpv4Test);
2588 DefragSturgesNovakSolarisTest);
2589 UtRegisterTest(
"DefragSturgesNovakFirstTest", DefragSturgesNovakFirstTest);
2590 UtRegisterTest(
"DefragSturgesNovakLastTest", DefragSturgesNovakLastTest);
2593 UtRegisterTest(
"DefragIPv4TooLargeTest", DefragIPv4TooLargeTest);
2595 UtRegisterTest(
"IPV6DefragInOrderSimpleTest", IPV6DefragInOrderSimpleTest);
2596 UtRegisterTest(
"IPV6DefragReverseSimpleTest", IPV6DefragReverseSimpleTest);
2598 IPV6DefragSturgesNovakBsdTest);
2600 IPV6DefragSturgesNovakLinuxTest);
2602 IPV6DefragSturgesNovakWindowsTest);
2604 IPV6DefragSturgesNovakSolarisTest);
2606 IPV6DefragSturgesNovakFirstTest);
2608 IPV6DefragSturgesNovakLastTest);
2613 UtRegisterTest(
"DefragTrackerReuseTest", DefragTrackerReuseTest);