65 #define DEFAULT_DEFRAG_HASH_SIZE 0xffff
66 #define DEFAULT_DEFRAG_POOL_SIZE 0xffff
72 #define TIMEOUT_DEFAULT 60
77 #define TIMEOUT_MAX (60 * 60 * 24)
109 DefragFragReset(
Frag *frag)
111 if (frag->
pkt != NULL)
113 memset(frag, 0,
sizeof(*frag));
129 DefragFragReset(frag);
143 DefragContextNew(
void)
152 intmax_t tracker_pool_size;
153 if (!
SCConfGetInt(
"defrag.trackers", &tracker_pool_size) || tracker_pool_size == 0) {
158 intmax_t frag_pool_size;
159 if (!
SCConfGetInt(
"defrag.max-frags", &frag_pool_size) || frag_pool_size == 0 ||
160 frag_pool_size > UINT32_MAX) {
163 uint32_t frag_pool_prealloc = (uint32_t)frag_pool_size / 2;
165 PoolInit((uint32_t)frag_pool_size, frag_pool_prealloc,
sizeof(
Frag), NULL, NULL, NULL);
167 FatalError(
"Defrag: Failed to initialize fragment pool.");
170 FatalError(
"Defrag: Failed to initialize frag pool mutex.");
179 FatalError(
"defrag: Timeout less than minimum allowed value.");
182 FatalError(
"defrag: Timeout greater than maximum allowed value.");
184 dc->
timeout = (uint32_t)timeout;
189 SCLogDebug(
"\tMaximum defrag trackers: %"PRIuMAX, tracker_pool_size);
190 SCLogDebug(
"\tPreallocated defrag trackers: %"PRIuMAX, tracker_pool_size);
191 SCLogDebug(
"\tMaximum fragments: %"PRIuMAX, (uintmax_t)frag_pool_size);
192 SCLogDebug(
"\tPreallocated fragments: %"PRIuMAX, (uintmax_t)frag_pool_prealloc);
226 }
else if (first->
offset != 0) {
231 goto error_remove_tracker;
250 const IPV4Hdr *oip4h = PacketGetIPv4(
p);
256 goto error_remove_tracker;
262 int fragmentable_offset = 0;
263 uint16_t fragmentable_len = 0;
265 int ip_hdr_offset = 0;
268 uint16_t prev_offset = 0;
272 SCLogDebug(
"frag %p, data_len %u, offset %u, pcap_cnt %"PRIu64,
277 if (!more_frags && frag->
offset > prev_offset) {
288 goto error_remove_tracker;
300 int pkt_end = fragmentable_offset + frag->
offset + frag->
data_len;
303 "fragmented packet, exceeds size of packet buffer.");
304 goto error_remove_tracker;
310 goto error_remove_tracker;
314 "fragmentable_len exceeds UINT16_MAX");
315 goto error_remove_tracker;
330 prev_offset = frag->
offset;
333 SCLogDebug(
"ip_hdr_offset %u, hlen %" PRIu16
", fragmentable_len %" PRIu16, ip_hdr_offset, hlen,
339 ip4h->
ip_len = htons(fragmentable_len + hlen);
342 SET_PKT_LEN(rp, ip_hdr_offset + hlen + fragmentable_len);
349 error_remove_tracker:
375 }
else if (first->
offset != 0) {
380 goto error_remove_tracker;
410 const IPV6Hdr *oip6h = PacketGetIPv6(
p);
417 goto error_remove_tracker;
423 uint16_t unfragmentable_len = 0;
424 int fragmentable_offset = 0;
425 uint16_t fragmentable_len = 0;
426 int ip_hdr_offset = 0;
427 uint8_t next_hdr = 0;
430 uint16_t prev_offset = 0;
434 if (!more_frags && frag->
offset > prev_offset) {
442 IPV6FragHdr *frag_hdr = (IPV6FragHdr *)(frag->
pkt +
444 next_hdr = frag_hdr->ip6fh_nxt;
450 goto error_remove_tracker;
454 goto error_remove_tracker;
468 unfragmentable_len = (uint16_t)(fragmentable_offset - ip_hdr_offset -
IPV6_HEADER_LEN);
469 if (unfragmentable_len >= fragmentable_offset)
470 goto error_remove_tracker;
476 goto error_remove_tracker;
490 prev_offset = frag->
offset;
495 ip6h->s_ip6_plen = htons(fragmentable_len + unfragmentable_len);
500 if (unfragmentable_len == 0)
501 ip6h->s_ip6_nxt = next_hdr;
503 unfragmentable_len + fragmentable_len);
510 error_remove_tracker:
544 uint16_t frag_offset;
551 uint16_t data_offset;
561 uint16_t ip_hdr_offset;
564 uint16_t frag_hdr_offset = 0;
567 int af = tracker->
af;
571 uint32_t ip6_nh_set_offset = 0;
572 uint8_t ip6_nh_set_value = 0;
578 if (tracker->
af == AF_INET) {
579 const IPV4Hdr *ip4h = PacketGetIPv4(
p);
583 data_offset = (uint16_t)((uint8_t *)ip4h + hlen -
GET_PKT_DATA(
p));
585 frag_end = frag_offset + data_len;
586 ip_hdr_offset = (uint16_t)((uint8_t *)ip4h -
GET_PKT_DATA(
p));
595 else if (tracker->
af == AF_INET6) {
596 const IPV6Hdr *ip6h = PacketGetIPv6(
p);
599 data_offset =
p->
l3.
vars.
ip6.eh.fh_data_offset;
601 frag_end = frag_offset + data_len;
602 ip_hdr_offset = (uint16_t)((uint8_t *)ip6h -
GET_PKT_DATA(
p));
603 frag_hdr_offset =
p->
l3.
vars.
ip6.eh.fh_header_offset;
605 SCLogDebug(
"mf %s frag_offset %u data_offset %u, data_len %u, "
606 "frag_end %u, ip_hdr_offset %u, frag_hdr_offset %u",
607 more_frags ?
"true" :
"false", frag_offset, data_offset,
608 data_len, frag_end, ip_hdr_offset, frag_hdr_offset);
612 SCLogDebug(
"we have exthdrs before fraghdr %u bytes",
619 ip6_nh_set_offset =
p->
l3.
vars.
ip6.eh.fh_prev_hdr_offset;
621 SCLogDebug(
"offset %d, value %u", ip6_nh_set_offset, ip6_nh_set_value);
640 bool overlap =
false;
645 .
offset = frag_offset - 1,
650 next = IP_FRAGMENTS_RB_NEXT(prev);
652 prev = IP_FRAGMENTS_RB_PREV(
next);
655 next = IP_FRAGMENTS_RB_NEXT(prev);
658 while (prev != NULL) {
666 switch (tracker->
policy) {
669 if (prev->
offset <= frag_offset) {
675 if (prev_end > frag_end) {
680 ltrim = prev_end - frag_offset;
682 if ((
next != NULL) && (frag_end >
next->offset)) {
683 next->ltrim = frag_end -
next->offset;
698 uint16_t prev_ltrim = frag_end - prev->
offset;
699 if (prev_ltrim > prev->
ltrim) {
700 prev->
ltrim = prev_ltrim;
704 if ((
next != NULL) && (frag_end >
next->offset)) {
705 next->ltrim = frag_end -
next->offset;
719 if (prev->
offset + prev->
ltrim < frag_offset + ltrim &&
732 if (frag_offset + ltrim < prev->
offset + prev->
ltrim &&
743 if (frag_offset + ltrim <= prev->
offset + prev->
ltrim &&
752 if (frag_offset + ltrim >= prev->
offset + ltrim &&
759 if (frag_offset + ltrim < prev->
offset + ltrim &&
772 if (frag_offset + ltrim > prev->
offset + prev->
ltrim &&
781 if (frag_offset + ltrim == prev->
offset + ltrim &&
789 if (frag_offset >= prev->
offset) {
792 if ((frag_offset < prev->
offset) &&
800 if ((frag_offset >= prev->
offset) &&
804 if (frag_offset < prev->
offset) {
813 if (frag_offset <= prev->
offset) {
814 if (frag_end > prev->
offset) {
837 DefragFragReset(prev);
846 if (ltrim >= data_len) {
862 if (
tv != NULL &&
dtv != NULL) {
865 goto error_remove_tracker;
868 if (new->pkt == NULL) {
877 goto error_remove_tracker;
884 if (ip6_nh_set_offset > 0 && frag_offset == 0 && ltrim == 0) {
885 if (new->len > ip6_nh_set_offset) {
886 SCLogDebug(
"updating frag to have 'correct' nh value: %u -> %u",
887 new->pkt[ip6_nh_set_offset], ip6_nh_set_value);
888 new->pkt[ip6_nh_set_offset] = ip6_nh_set_value;
893 new->offset = frag_offset + ltrim;
894 new->data_offset = data_offset;
895 new->data_len = data_len - ltrim;
896 new->frag_hdr_offset = frag_hdr_offset;
897 new->more_frags = more_frags;
899 new->pcap_cnt = pcap_cnt;
901 if (new->offset == 0) {
913 if (tracker->
af == AF_INET) {
914 r = Defrag4Reassemble(
tv, tracker,
p);
915 if (r != NULL &&
tv != NULL &&
dtv != NULL) {
919 else if (tracker->
af == AF_INET6) {
920 r = Defrag6Reassemble(
tv, tracker,
p);
921 if (r != NULL &&
tv != NULL &&
dtv != NULL) {
938 error_remove_tracker:
957 if (PacketIsIPv4(
p)) {
959 }
else if (PacketIsIPv6(
p)) {
964 return default_policy;
1007 return default_policy;
1033 uint16_t frag_offset;
1038 if (PacketIsIPv4(
p)) {
1039 const IPV4Hdr *ip4h = PacketGetIPv4(
p);
1043 }
else if (PacketIsIPv6(
p)) {
1051 if (frag_offset == 0 && more_frags == 0) {
1055 if (
af == AF_INET) {
1057 }
else if (
af == AF_INET6) {
1062 tracker = DefragGetTracker(
tv,
dtv,
p);
1063 if (tracker == NULL) {
1064 if (
tv != NULL &&
dtv != NULL) {
1075 int tracker_af = tracker->
af;
1084 const uint32_t
len =
GET_PKT_LEN(rp) - (uint32_t)tracker_ip_hdr_offset;
1087 if (tracker_af == AF_INET) {
1109 intmax_t tracker_pool_size;
1110 if (!
SCConfGetInt(
"defrag.trackers", &tracker_pool_size)) {
1118 defrag_context = DefragContextNew();
1119 if (defrag_context == NULL) {
1120 FatalError(
"Failed to allocate memory for the Defrag module.");
1130 DefragContextDestroy(defrag_context);
1131 defrag_context = NULL;
1139 #define IP_MF 0x2000
1148 static Packet *BuildIpv4TestPacket(
1149 uint8_t
proto, uint16_t
id, uint16_t off,
int mf,
const char content,
int content_len)
1163 struct timeval tval;
1164 gettimeofday(&tval, NULL);
1169 ip4h.
ip_len = htons(hlen + content_len);
1170 ip4h.
ip_id = htons(
id);
1174 ip4h.
ip_off = htons(off);
1178 ip4h.s_ip_src.s_addr = 0x01010101;
1179 ip4h.s_ip_dst.s_addr = 0x02020202;
1187 pcontent =
SCCalloc(1, content_len);
1190 memset(pcontent, content, content_len);
1214 static int BuildIpv4TestPacketWithContent(
Packet **packet, uint8_t
proto, uint16_t
id, uint16_t off,
1215 int mf,
const uint8_t *content,
int content_len)
1227 struct timeval tval;
1228 gettimeofday(&tval, NULL);
1232 ip4h.
ip_len = htons(hlen + content_len);
1233 ip4h.
ip_id = htons(
id);
1237 ip4h.
ip_off = htons(off);
1241 ip4h.s_ip_src.s_addr = 0x01010101;
1242 ip4h.s_ip_dst.s_addr = 0x02020202;
1269 static Packet *BuildIpv6TestPacket(
1270 uint8_t
proto, uint32_t
id, uint16_t off,
int mf,
const uint8_t content,
int content_len)
1282 struct timeval tval;
1283 gettimeofday(&tval, NULL);
1286 ip6h.s_ip6_nxt = 44;
1287 ip6h.s_ip6_hlim = 2;
1290 ip6h.s_ip6_src[0] = 0x01010101;
1291 ip6h.s_ip6_src[1] = 0x01010101;
1292 ip6h.s_ip6_src[2] = 0x01010101;
1293 ip6h.s_ip6_src[3] = 0x01010101;
1294 ip6h.s_ip6_dst[0] = 0x02020202;
1295 ip6h.s_ip6_dst[1] = 0x02020202;
1296 ip6h.s_ip6_dst[2] = 0x02020202;
1297 ip6h.s_ip6_dst[3] = 0x02020202;
1306 fh->ip6fh_nxt =
proto;
1307 fh->ip6fh_ident = htonl(
id);
1308 fh->ip6fh_offlg = htons((off << 3) | mf);
1312 pcontent =
SCCalloc(1, content_len);
1315 memset(pcontent, content, content_len);
1320 ip6p->s_ip6_plen = htons(
sizeof(IPV6FragHdr) + content_len);
1340 static Packet *BuildIpv6TestPacketWithContent(
1341 uint8_t
proto, uint32_t
id, uint16_t off,
int mf,
const uint8_t *content,
int content_len)
1352 struct timeval tval;
1353 gettimeofday(&tval, NULL);
1356 ip6h.s_ip6_nxt = 44;
1357 ip6h.s_ip6_hlim = 2;
1360 ip6h.s_ip6_src[0] = 0x01010101;
1361 ip6h.s_ip6_src[1] = 0x01010101;
1362 ip6h.s_ip6_src[2] = 0x01010101;
1363 ip6h.s_ip6_src[3] = 0x01010101;
1364 ip6h.s_ip6_dst[0] = 0x02020202;
1365 ip6h.s_ip6_dst[1] = 0x02020202;
1366 ip6h.s_ip6_dst[2] = 0x02020202;
1367 ip6h.s_ip6_dst[3] = 0x02020202;
1376 fh->ip6fh_nxt =
proto;
1377 fh->ip6fh_ident = htonl(
id);
1378 fh->ip6fh_offlg = htons((off << 3) | mf);
1385 ip6p->s_ip6_plen = htons(
sizeof(IPV6FragHdr) + content_len);
1409 static int DefragInOrderSimpleTest(
void)
1411 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1412 Packet *reassembled = NULL;
1417 p1 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 8);
1419 p2 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 1, 1,
'B', 8);
1421 p3 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 2, 0,
'C', 3);
1434 for (
int i = 20; i < 20 + 8; i++) {
1439 for (
int i = 28; i < 28 + 8; i++) {
1444 for (
int i = 36; i < 36 + 3; i++) {
1460 static int DefragReverseSimpleTest(
void)
1462 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1463 Packet *reassembled = NULL;
1468 p1 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 8);
1470 p2 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 1, 1,
'B', 8);
1472 p3 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 2, 0,
'C', 3);
1484 for (
int i = 20; i < 20 + 8; i++) {
1489 for (
int i = 28; i < 28 + 8; i++) {
1494 for (
int i = 36; i < 36 + 3; i++) {
1511 static int DefragInOrderSimpleIpv6Test(
void)
1513 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1514 Packet *reassembled = NULL;
1519 p1 = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 0, 1,
'A', 8);
1521 p2 = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 1, 1,
'B', 8);
1523 p3 = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 2, 0,
'C', 3);
1531 const IPV6Hdr *ip6h = PacketGetIPv6(reassembled);
1535 for (
int i = 40; i < 40 + 8; i++) {
1540 for (
int i = 48; i < 48 + 8; i++) {
1545 for (
int i = 56; i < 56 + 3; i++) {
1558 static int DefragReverseSimpleIpv6Test(
void)
1561 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1562 Packet *reassembled = NULL;
1567 dc = DefragContextNew();
1570 p1 = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 0, 1,
'A', 8);
1572 p2 = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 1, 1,
'B', 8);
1574 p3 = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 2, 0,
'C', 3);
1583 for (
int i = 40; i < 40 + 8; i++) {
1588 for (
int i = 48; i < 48 + 8; i++) {
1593 for (
int i = 56; i < 56 + 3; i++) {
1597 DefragContextDestroy(dc);
1607 static int DefragDoSturgesNovakTest(
int policy, uint8_t *expected,
size_t expected_len)
1619 memset(packets, 0x00,
sizeof(packets));
1626 packets[0] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 24);
1629 packets[1] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 32 >> 3, 1,
'B', 16);
1632 packets[2] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 48 >> 3, 1,
'C', 24);
1635 packets[3] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 80 >> 3, 1,
'D', 8);
1638 packets[4] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 104 >> 3, 1,
'E', 16);
1641 packets[5] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 120 >> 3, 1,
'F', 24);
1644 packets[6] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 144 >> 3, 1,
'G', 16);
1647 packets[7] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 160 >> 3, 1,
'H', 16);
1650 packets[8] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 176 >> 3, 1,
'I', 8);
1657 packets[9] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 8 >> 3, 1,
'J', 32);
1660 packets[10] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 48 >> 3, 1,
'K', 24);
1663 packets[11] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 72 >> 3, 1,
'L', 24);
1666 packets[12] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 96 >> 3, 1,
'M', 24);
1669 packets[13] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 128 >> 3, 1,
'N', 8);
1672 packets[14] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 152 >> 3, 1,
'O', 8);
1675 packets[15] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 160 >> 3, 1,
'P', 8);
1678 packets[16] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 176 >> 3, 0,
'Q', 16);
1680 default_policy = policy;
1683 for (i = 0; i < 9; i++) {
1689 for (; i < 16; i++) {
1706 if (memcmp(expected,
GET_PKT_DATA(reassembled) + 20, expected_len) != 0) {
1707 printf(
"Expected:\n");
1718 for (i = 0; i < 17; i++) {
1725 static int DefragDoSturgesNovakIpv6Test(
int policy, uint8_t *expected,
size_t expected_len)
1737 memset(packets, 0x00,
sizeof(packets));
1744 packets[0] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 0, 1,
'A', 24);
1747 packets[1] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 32 >> 3, 1,
'B', 16);
1750 packets[2] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 48 >> 3, 1,
'C', 24);
1753 packets[3] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 80 >> 3, 1,
'D', 8);
1756 packets[4] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 104 >> 3, 1,
'E', 16);
1759 packets[5] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 120 >> 3, 1,
'F', 24);
1762 packets[6] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 144 >> 3, 1,
'G', 16);
1765 packets[7] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 160 >> 3, 1,
'H', 16);
1768 packets[8] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 176 >> 3, 1,
'I', 8);
1775 packets[9] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 8 >> 3, 1,
'J', 32);
1778 packets[10] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 48 >> 3, 1,
'K', 24);
1781 packets[11] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 72 >> 3, 1,
'L', 24);
1784 packets[12] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 96 >> 3, 1,
'M', 24);
1787 packets[13] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 128 >> 3, 1,
'N', 8);
1790 packets[14] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 152 >> 3, 1,
'O', 8);
1793 packets[15] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 160 >> 3, 1,
'P', 8);
1796 packets[16] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 176 >> 3, 0,
'Q', 16);
1798 default_policy = policy;
1801 for (i = 0; i < 9; i++) {
1807 for (; i < 16; i++) {
1828 for (i = 0; i < 17; i++) {
1843 #define D_1 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'
1844 #define D_2 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B'
1845 #define D_3 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C'
1846 #define D_3_1 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D'
1847 #define D_3_2 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E'
1848 #define D_3_3 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F'
1849 #define D_3_4 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G'
1850 #define D_3_5 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H'
1851 #define D_3_6 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'I'
1852 #define D_4 'J', 'J', 'J', 'J', 'J', 'J', 'J', 'J'
1853 #define D_5 'K', 'K', 'K', 'K', 'K', 'K', 'K', 'K'
1854 #define D_6 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'
1855 #define D_7 'M', 'M', 'M', 'M', 'M', 'M', 'M', 'M'
1856 #define D_8 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N'
1857 #define D_9 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O'
1858 #define D_10 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'
1859 #define D_11 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q'
1862 DefragSturgesNovakBsdTest(
void)
1865 uint8_t expected[] = {
1897 static int DefragSturgesNovakBsdIpv6Test(
void)
1900 uint8_t expected[] = {
1931 static int DefragSturgesNovakLinuxIpv4Test(
void)
1934 uint8_t expected[] = {
1966 static int DefragSturgesNovakLinuxIpv6Test(
void)
1969 uint8_t expected[] = {
2000 static int DefragSturgesNovakWindowsIpv4Test(
void)
2003 uint8_t expected[] = {
2035 static int DefragSturgesNovakWindowsIpv6Test(
void)
2038 uint8_t expected[] = {
2069 static int DefragSturgesNovakSolarisTest(
void)
2072 uint8_t expected[] = {
2104 static int DefragSturgesNovakSolarisIpv6Test(
void)
2107 uint8_t expected[] = {
2138 static int DefragSturgesNovakFirstTest(
void)
2141 uint8_t expected[] = {
2173 static int DefragSturgesNovakFirstIpv6Test(
void)
2176 uint8_t expected[] = {
2207 DefragSturgesNovakLastTest(
void)
2210 uint8_t expected[] = {
2242 static int DefragSturgesNovakLastIpv6Test(
void)
2245 uint8_t expected[] = {
2276 static int DefragTimeoutTest(
void)
2286 for (i = 0; i < 16; i++) {
2287 Packet *
p = BuildIpv4TestPacket(IPPROTO_ICMP, i, 0, 1,
'A' + i, 16);
2297 Packet *
p = BuildIpv4TestPacket(IPPROTO_ICMP, 99, 0, 1,
'A' + i, 16);
2322 static int DefragNoDataIpv4Test(
void)
2330 dc = DefragContextNew();
2334 p = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 1, 0,
'A', 0);
2344 DefragContextDestroy(dc);
2351 static int DefragTooLargeIpv4Test(
void)
2358 dc = DefragContextNew();
2363 p = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 8183, 0,
'A', 71);
2376 DefragContextDestroy(dc);
2388 static int DefragVlanTest(
void)
2390 Packet *p1 = NULL, *p2 = NULL, *r = NULL;
2394 p1 = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 0, 1,
'A', 8);
2396 p2 = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 1, 0,
'B', 8);
2420 static int DefragVlanQinQTest(
void)
2422 Packet *p1 = NULL, *p2 = NULL, *r = NULL;
2426 p1 = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 0, 1,
'A', 8);
2428 p2 = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 1, 0,
'B', 8);
2454 static int DefragVlanQinQinQTest(
void)
2460 Packet *p1 = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 0, 1,
'A', 8);
2462 Packet *p2 = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 1, 0,
'B', 8);
2486 static int DefragTrackerReuseTest(
void)
2496 p1 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 0, 0,
'A', 8);
2509 FAIL_IF(tracker2 != tracker1);
2522 FAIL_IF(tracker2 != tracker1);
2539 static int DefragMfIpv4Test(
void)
2546 Packet *p1 = BuildIpv4TestPacket(IPPROTO_ICMP, ip_id, 2, 1,
'C', 8);
2547 Packet *p2 = BuildIpv4TestPacket(IPPROTO_ICMP, ip_id, 0, 1,
'A', 8);
2548 Packet *p3 = BuildIpv4TestPacket(IPPROTO_ICMP, ip_id, 1, 0,
'B', 8);
2549 FAIL_IF(p1 == NULL || p2 == NULL || p3 == NULL);
2566 uint8_t expected_payload[] =
"AAAAAAAABBBBBBBB";
2586 static int DefragMfIpv6Test(
void)
2593 Packet *p1 = BuildIpv6TestPacket(IPPROTO_ICMPV6, ip_id, 2, 1,
'C', 8);
2594 Packet *p2 = BuildIpv6TestPacket(IPPROTO_ICMPV6, ip_id, 0, 1,
'A', 8);
2595 Packet *p3 = BuildIpv6TestPacket(IPPROTO_ICMPV6, ip_id, 1, 0,
'B', 8);
2596 FAIL_IF(p1 == NULL || p2 == NULL || p3 == NULL);
2613 uint8_t expected_payload[] =
"AAAAAAAABBBBBBBB";
2628 static int DefragTestBadProto(
void)
2630 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
2635 p1 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 8);
2637 p2 = BuildIpv4TestPacket(IPPROTO_UDP,
id, 1, 1,
'B', 8);
2639 p3 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 2, 0,
'C', 3);
2658 static int DefragTestJeremyLinux(
void)
2661 uint8_t expected[] =
"AAAAAAAA"
2682 packets[0] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 24);
2683 packets[1] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 40 >> 3, 1,
'B', 48);
2684 packets[2] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 24 >> 3, 1,
'C', 48);
2685 packets[3] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 88 >> 3, 0,
'D', 14);
2701 for (i = 0; i < 4; i++) {
2720 static int DefragBsdFragmentAfterNoMfIpv4Test(
void)
2726 packets[0] = BuildIpv4TestPacket(IPPROTO_ICMP, 0x96, 24 >> 3, 0,
'A', 16);
2727 packets[1] = BuildIpv4TestPacket(IPPROTO_ICMP, 0x96, 8 >> 3, 1,
'B', 16);
2728 packets[2] = BuildIpv4TestPacket(IPPROTO_ICMP, 0x96, 16 >> 3, 1,
'C', 16);
2729 packets[3] = BuildIpv4TestPacket(IPPROTO_ICMP, 0x96, 0, 1,
'D', 8);
2744 uint8_t expected[] = {
2745 'D',
'D',
'D',
'D',
'D',
'D',
'D',
'D',
2746 'B',
'B',
'B',
'B',
'B',
'B',
'B',
'B',
2747 'B',
'B',
'B',
'B',
'B',
'B',
'B',
'B',
2748 'C',
'C',
'C',
'C',
'C',
'C',
'C',
'C',
2749 'A',
'A',
'A',
'A',
'A',
'A',
'A',
'A',
2753 if (memcmp(expected,
GET_PKT_DATA(r) + 20,
sizeof(expected)) != 0) {
2754 printf(
"Expected:\n");
2761 for (
int i = 0; i < 4; i++) {
2769 static int DefragBsdFragmentAfterNoMfIpv6Test(
void)
2775 packets[0] = BuildIpv6TestPacket(IPPROTO_ICMP, 0x96, 24 >> 3, 0,
'A', 16);
2776 packets[1] = BuildIpv6TestPacket(IPPROTO_ICMP, 0x96, 8 >> 3, 1,
'B', 16);
2777 packets[2] = BuildIpv6TestPacket(IPPROTO_ICMP, 0x96, 16 >> 3, 1,
'C', 16);
2778 packets[3] = BuildIpv6TestPacket(IPPROTO_ICMP, 0x96, 0, 1,
'D', 8);
2793 uint8_t expected[] = {
2794 'D',
'D',
'D',
'D',
'D',
'D',
'D',
'D',
2795 'B',
'B',
'B',
'B',
'B',
'B',
'B',
'B',
2796 'B',
'B',
'B',
'B',
'B',
'B',
'B',
'B',
2797 'C',
'C',
'C',
'C',
'C',
'C',
'C',
'C',
2798 'A',
'A',
'A',
'A',
'A',
'A',
'A',
'A',
2802 if (memcmp(expected,
GET_PKT_DATA(r) + 40,
sizeof(expected)) != 0) {
2803 printf(
"Expected:\n");
2810 for (
int i = 0; i < 4; i++) {
2818 static int DefragBsdSubsequentOverlapsStartOfOriginalIpv4Test_2(
void)
2826 &packets[0], IPPROTO_ICMP, 6, 16 >> 3, 1, (uint8_t *)
"AABBCCDDAABBDDCC", 16));
2830 &packets[1], IPPROTO_ICMP, 6, 8 >> 3, 1, (uint8_t *)
"AACCBBDDAACCDDBB", 16));
2834 &packets[2], IPPROTO_ICMP, 6, 0, 1, (uint8_t *)
"ZZZZZZZZ", 8));
2838 &packets[3], IPPROTO_ICMP, 6, 32 >> 3, 0, (uint8_t *)
"DDCCBBAA", 8));
2853 const uint8_t expected[] = {
2858 'A',
'A',
'C',
'C',
'B',
'B',
'D',
'D',
2859 'A',
'A',
'C',
'C',
'D',
'D',
'B',
'B',
2860 'A',
'A',
'B',
'B',
'D',
'D',
'C',
'C',
2861 'D',
'D',
'C',
'C',
'B',
'B',
'A',
'A',
2867 for (
int i = 0; i < 4; i++) {
2875 static int DefragBsdSubsequentOverlapsStartOfOriginalIpv6Test_2(
void)
2882 packets[0] = BuildIpv6TestPacketWithContent(
2883 IPPROTO_ICMP, 6, 16 >> 3, 1, (uint8_t *)
"AABBCCDDAABBDDCC", 16);
2886 packets[1] = BuildIpv6TestPacketWithContent(
2887 IPPROTO_ICMP, 6, 8 >> 3, 1, (uint8_t *)
"AACCBBDDAACCDDBB", 16);
2890 packets[2] = BuildIpv6TestPacketWithContent(IPPROTO_ICMP, 6, 0, 1, (uint8_t *)
"ZZZZZZZZ", 8);
2894 BuildIpv6TestPacketWithContent(IPPROTO_ICMP, 6, 32 >> 3, 0, (uint8_t *)
"DDCCBBAA", 8);
2909 const uint8_t expected[] = {
2914 'A',
'A',
'C',
'C',
'B',
'B',
'D',
'D',
2915 'A',
'A',
'C',
'C',
'D',
'D',
'B',
'B',
2916 'A',
'A',
'B',
'B',
'D',
'D',
'C',
'C',
2917 'D',
'D',
'C',
'C',
'B',
'B',
'A',
'A',
2923 for (
int i = 0; i < 4; i++) {
2943 static int DefragBsdSubsequentOverlapsStartOfOriginalIpv4Test(
void)
2949 packets[0] = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 8 >> 3, 0,
'E', 24);
2950 packets[1] = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 0, 1,
'M', 24);
2959 const uint8_t expected[] = {
2960 'M',
'M',
'M',
'M',
'M',
'M',
'M',
'M',
2961 'M',
'M',
'M',
'M',
'M',
'M',
'M',
'M',
2962 'M',
'M',
'M',
'M',
'M',
'M',
'M',
'M',
2963 'E',
'E',
'E',
'E',
'E',
'E',
'E',
'E',
2967 if (memcmp(expected,
GET_PKT_DATA(r) + 20,
sizeof(expected)) != 0) {
2968 printf(
"Expected:\n");
2975 for (
int i = 0; i < 2; i++) {
2983 static int DefragBsdSubsequentOverlapsStartOfOriginalIpv6Test(
void)
2989 packets[0] = BuildIpv6TestPacket(IPPROTO_ICMP, 1, 8 >> 3, 0,
'E', 24);
2990 packets[1] = BuildIpv6TestPacket(IPPROTO_ICMP, 1, 0, 1,
'M', 24);
2999 const uint8_t expected[] = {
3000 'M',
'M',
'M',
'M',
'M',
'M',
'M',
'M',
3001 'M',
'M',
'M',
'M',
'M',
'M',
'M',
'M',
3002 'M',
'M',
'M',
'M',
'M',
'M',
'M',
'M',
3003 'E',
'E',
'E',
'E',
'E',
'E',
'E',
'E',
3007 if (memcmp(expected,
GET_PKT_DATA(r) + 40,
sizeof(expected)) != 0) {
3008 printf(
"Expected:\n");
3015 for (
int i = 0; i < 2; i++) {
3034 static int DefragBsdMissingFragmentIpv4Test(
void)
3041 &packets[0], IPPROTO_ICMP, 189, 16 >> 3, 1, (uint8_t *)
"AABBCCDDAABBDDCC", 16));
3044 &packets[1], IPPROTO_ICMP, 189, 40 >> 3, 1, (uint8_t *)
"AACCBBDD", 8));
3047 &packets[2], IPPROTO_ICMP, 189, 8 >> 3, 1, (uint8_t *)
"AACCDDBBAADDBBCC", 16));
3051 &packets[3], IPPROTO_ICMP, 189, 0, 1, (uint8_t *)
"ZZZZZZZZ", 8));
3054 &packets[4], IPPROTO_ICMP, 189, 48 >> 3, 0, (uint8_t *)
"DDCCBBAA", 8));
3075 for (
int i = 0; i < 5; i++) {
3082 static int DefragBsdMissingFragmentIpv6Test(
void)
3088 packets[0] = BuildIpv6TestPacketWithContent(
3089 IPPROTO_ICMP, 189, 16 >> 3, 1, (uint8_t *)
"AABBCCDDAABBDDCC", 16);
3092 BuildIpv6TestPacketWithContent(IPPROTO_ICMP, 189, 40 >> 3, 1, (uint8_t *)
"AACCBBDD", 8);
3094 packets[2] = BuildIpv6TestPacketWithContent(
3095 IPPROTO_ICMP, 189, 8 >> 3, 1, (uint8_t *)
"AACCDDBBAADDBBCC", 16);
3098 packets[3] = BuildIpv6TestPacketWithContent(IPPROTO_ICMP, 189, 0, 1, (uint8_t *)
"ZZZZZZZZ", 8);
3101 BuildIpv6TestPacketWithContent(IPPROTO_ICMP, 189, 48 >> 3, 0, (uint8_t *)
"DDCCBBAA", 8);
3122 for (
int i = 0; i < 5; i++) {
3134 UtRegisterTest(
"DefragInOrderSimpleTest", DefragInOrderSimpleTest);
3135 UtRegisterTest(
"DefragReverseSimpleTest", DefragReverseSimpleTest);
3136 UtRegisterTest(
"DefragSturgesNovakBsdTest", DefragSturgesNovakBsdTest);
3138 DefragSturgesNovakLinuxIpv4Test);
3140 DefragSturgesNovakWindowsIpv4Test);
3142 DefragSturgesNovakSolarisTest);
3143 UtRegisterTest(
"DefragSturgesNovakFirstTest", DefragSturgesNovakFirstTest);
3144 UtRegisterTest(
"DefragSturgesNovakLastTest", DefragSturgesNovakLastTest);
3147 UtRegisterTest(
"DefragTooLargeIpv4Test", DefragTooLargeIpv4Test);
3149 UtRegisterTest(
"DefragInOrderSimpleIpv6Test", DefragInOrderSimpleIpv6Test);
3150 UtRegisterTest(
"DefragReverseSimpleIpv6Test", DefragReverseSimpleIpv6Test);
3151 UtRegisterTest(
"DefragSturgesNovakBsdIpv6Test", DefragSturgesNovakBsdIpv6Test);
3152 UtRegisterTest(
"DefragSturgesNovakLinuxIpv6Test", DefragSturgesNovakLinuxIpv6Test);
3153 UtRegisterTest(
"DefragSturgesNovakWindowsIpv6Test", DefragSturgesNovakWindowsIpv6Test);
3154 UtRegisterTest(
"DefragSturgesNovakSolarisIpv6Test", DefragSturgesNovakSolarisIpv6Test);
3155 UtRegisterTest(
"DefragSturgesNovakFirstIpv6Test", DefragSturgesNovakFirstIpv6Test);
3156 UtRegisterTest(
"DefragSturgesNovakLastIpv6Test", DefragSturgesNovakLastIpv6Test);
3161 UtRegisterTest(
"DefragTrackerReuseTest", DefragTrackerReuseTest);
3169 UtRegisterTest(
"DefragBsdFragmentAfterNoMfIpv4Test", DefragBsdFragmentAfterNoMfIpv4Test);
3170 UtRegisterTest(
"DefragBsdFragmentAfterNoMfIpv6Test", DefragBsdFragmentAfterNoMfIpv6Test);
3171 UtRegisterTest(
"DefragBsdSubsequentOverlapsStartOfOriginalIpv4Test",
3172 DefragBsdSubsequentOverlapsStartOfOriginalIpv4Test);
3173 UtRegisterTest(
"DefragBsdSubsequentOverlapsStartOfOriginalIpv6Test",
3174 DefragBsdSubsequentOverlapsStartOfOriginalIpv6Test);
3175 UtRegisterTest(
"DefragBsdSubsequentOverlapsStartOfOriginalIpv4Test_2",
3176 DefragBsdSubsequentOverlapsStartOfOriginalIpv4Test_2);
3177 UtRegisterTest(
"DefragBsdSubsequentOverlapsStartOfOriginalIpv6Test_2",
3178 DefragBsdSubsequentOverlapsStartOfOriginalIpv6Test_2);
3179 UtRegisterTest(
"DefragBsdMissingFragmentIpv4Test", DefragBsdMissingFragmentIpv4Test);
3180 UtRegisterTest(
"DefragBsdMissingFragmentIpv6Test", DefragBsdMissingFragmentIpv6Test);