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)
1166 struct timeval tval;
1167 gettimeofday(&tval, NULL);
1172 ip4h.
ip_len = htons(hlen + content_len);
1173 ip4h.
ip_id = htons(
id);
1177 ip4h.
ip_off = htons(off);
1181 ip4h.s_ip_src.s_addr = 0x01010101;
1182 ip4h.s_ip_dst.s_addr = 0x02020202;
1190 pcontent =
SCCalloc(1, content_len);
1193 memset(pcontent, content, content_len);
1217 static int BuildIpv4TestPacketWithContent(
Packet **packet, uint8_t
proto, uint16_t
id, uint16_t off,
1218 int mf,
const uint8_t *content,
int content_len)
1230 struct timeval tval;
1231 gettimeofday(&tval, NULL);
1235 ip4h.
ip_len = htons(hlen + content_len);
1236 ip4h.
ip_id = htons(
id);
1240 ip4h.
ip_off = htons(off);
1244 ip4h.s_ip_src.s_addr = 0x01010101;
1245 ip4h.s_ip_dst.s_addr = 0x02020202;
1272 static Packet *BuildIpv6TestPacket(
1273 uint8_t
proto, uint32_t
id, uint16_t off,
int mf,
const uint8_t content,
int content_len)
1288 struct timeval tval;
1289 gettimeofday(&tval, NULL);
1292 ip6h.s_ip6_nxt = 44;
1293 ip6h.s_ip6_hlim = 2;
1296 ip6h.s_ip6_src[0] = 0x01010101;
1297 ip6h.s_ip6_src[1] = 0x01010101;
1298 ip6h.s_ip6_src[2] = 0x01010101;
1299 ip6h.s_ip6_src[3] = 0x01010101;
1300 ip6h.s_ip6_dst[0] = 0x02020202;
1301 ip6h.s_ip6_dst[1] = 0x02020202;
1302 ip6h.s_ip6_dst[2] = 0x02020202;
1303 ip6h.s_ip6_dst[3] = 0x02020202;
1312 fh->ip6fh_nxt =
proto;
1313 fh->ip6fh_ident = htonl(
id);
1314 fh->ip6fh_offlg = htons((off << 3) | mf);
1318 pcontent =
SCCalloc(1, content_len);
1321 memset(pcontent, content, content_len);
1326 ip6p->s_ip6_plen = htons(
sizeof(IPV6FragHdr) + content_len);
1346 static Packet *BuildIpv6TestPacketWithContent(
1347 uint8_t
proto, uint32_t
id, uint16_t off,
int mf,
const uint8_t *content,
int content_len)
1361 struct timeval tval;
1362 gettimeofday(&tval, NULL);
1365 ip6h.s_ip6_nxt = 44;
1366 ip6h.s_ip6_hlim = 2;
1369 ip6h.s_ip6_src[0] = 0x01010101;
1370 ip6h.s_ip6_src[1] = 0x01010101;
1371 ip6h.s_ip6_src[2] = 0x01010101;
1372 ip6h.s_ip6_src[3] = 0x01010101;
1373 ip6h.s_ip6_dst[0] = 0x02020202;
1374 ip6h.s_ip6_dst[1] = 0x02020202;
1375 ip6h.s_ip6_dst[2] = 0x02020202;
1376 ip6h.s_ip6_dst[3] = 0x02020202;
1385 fh->ip6fh_nxt =
proto;
1386 fh->ip6fh_ident = htonl(
id);
1387 fh->ip6fh_offlg = htons((off << 3) | mf);
1394 ip6p->s_ip6_plen = htons(
sizeof(IPV6FragHdr) + content_len);
1418 static int DefragInOrderSimpleTest(
void)
1420 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1421 Packet *reassembled = NULL;
1426 p1 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 8);
1428 p2 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 1, 1,
'B', 8);
1430 p3 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 2, 0,
'C', 3);
1443 for (
int i = 20; i < 20 + 8; i++) {
1448 for (
int i = 28; i < 28 + 8; i++) {
1453 for (
int i = 36; i < 36 + 3; i++) {
1469 static int DefragReverseSimpleTest(
void)
1471 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1472 Packet *reassembled = NULL;
1477 p1 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 8);
1479 p2 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 1, 1,
'B', 8);
1481 p3 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 2, 0,
'C', 3);
1493 for (
int i = 20; i < 20 + 8; i++) {
1498 for (
int i = 28; i < 28 + 8; i++) {
1503 for (
int i = 36; i < 36 + 3; i++) {
1520 static int DefragInOrderSimpleIpv6Test(
void)
1522 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1523 Packet *reassembled = NULL;
1528 p1 = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 0, 1,
'A', 8);
1530 p2 = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 1, 1,
'B', 8);
1532 p3 = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 2, 0,
'C', 3);
1540 const IPV6Hdr *ip6h = PacketGetIPv6(reassembled);
1544 for (
int i = 40; i < 40 + 8; i++) {
1549 for (
int i = 48; i < 48 + 8; i++) {
1554 for (
int i = 56; i < 56 + 3; i++) {
1567 static int DefragReverseSimpleIpv6Test(
void)
1570 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
1571 Packet *reassembled = NULL;
1576 dc = DefragContextNew();
1579 p1 = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 0, 1,
'A', 8);
1581 p2 = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 1, 1,
'B', 8);
1583 p3 = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 2, 0,
'C', 3);
1592 for (
int i = 40; i < 40 + 8; i++) {
1597 for (
int i = 48; i < 48 + 8; i++) {
1602 for (
int i = 56; i < 56 + 3; i++) {
1606 DefragContextDestroy(dc);
1616 static int DefragDoSturgesNovakTest(
int policy, uint8_t *expected,
size_t expected_len)
1628 memset(packets, 0x00,
sizeof(packets));
1635 packets[0] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 24);
1638 packets[1] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 32 >> 3, 1,
'B', 16);
1641 packets[2] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 48 >> 3, 1,
'C', 24);
1644 packets[3] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 80 >> 3, 1,
'D', 8);
1647 packets[4] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 104 >> 3, 1,
'E', 16);
1650 packets[5] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 120 >> 3, 1,
'F', 24);
1653 packets[6] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 144 >> 3, 1,
'G', 16);
1656 packets[7] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 160 >> 3, 1,
'H', 16);
1659 packets[8] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 176 >> 3, 1,
'I', 8);
1666 packets[9] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 8 >> 3, 1,
'J', 32);
1669 packets[10] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 48 >> 3, 1,
'K', 24);
1672 packets[11] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 72 >> 3, 1,
'L', 24);
1675 packets[12] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 96 >> 3, 1,
'M', 24);
1678 packets[13] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 128 >> 3, 1,
'N', 8);
1681 packets[14] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 152 >> 3, 1,
'O', 8);
1684 packets[15] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 160 >> 3, 1,
'P', 8);
1687 packets[16] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 176 >> 3, 0,
'Q', 16);
1689 default_policy = policy;
1692 for (i = 0; i < 9; i++) {
1698 for (; i < 16; i++) {
1715 if (memcmp(expected,
GET_PKT_DATA(reassembled) + 20, expected_len) != 0) {
1716 printf(
"Expected:\n");
1727 for (i = 0; i < 17; i++) {
1734 static int DefragDoSturgesNovakIpv6Test(
int policy, uint8_t *expected,
size_t expected_len)
1746 memset(packets, 0x00,
sizeof(packets));
1753 packets[0] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 0, 1,
'A', 24);
1756 packets[1] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 32 >> 3, 1,
'B', 16);
1759 packets[2] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 48 >> 3, 1,
'C', 24);
1762 packets[3] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 80 >> 3, 1,
'D', 8);
1765 packets[4] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 104 >> 3, 1,
'E', 16);
1768 packets[5] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 120 >> 3, 1,
'F', 24);
1771 packets[6] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 144 >> 3, 1,
'G', 16);
1774 packets[7] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 160 >> 3, 1,
'H', 16);
1777 packets[8] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 176 >> 3, 1,
'I', 8);
1784 packets[9] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 8 >> 3, 1,
'J', 32);
1787 packets[10] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 48 >> 3, 1,
'K', 24);
1790 packets[11] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 72 >> 3, 1,
'L', 24);
1793 packets[12] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 96 >> 3, 1,
'M', 24);
1796 packets[13] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 128 >> 3, 1,
'N', 8);
1799 packets[14] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 152 >> 3, 1,
'O', 8);
1802 packets[15] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 160 >> 3, 1,
'P', 8);
1805 packets[16] = BuildIpv6TestPacket(IPPROTO_ICMPV6,
id, 176 >> 3, 0,
'Q', 16);
1807 default_policy = policy;
1810 for (i = 0; i < 9; i++) {
1816 for (; i < 16; i++) {
1837 for (i = 0; i < 17; i++) {
1852 #define D_1 'A', 'A', 'A', 'A', 'A', 'A', 'A', 'A'
1853 #define D_2 'B', 'B', 'B', 'B', 'B', 'B', 'B', 'B'
1854 #define D_3 'C', 'C', 'C', 'C', 'C', 'C', 'C', 'C'
1855 #define D_3_1 'D', 'D', 'D', 'D', 'D', 'D', 'D', 'D'
1856 #define D_3_2 'E', 'E', 'E', 'E', 'E', 'E', 'E', 'E'
1857 #define D_3_3 'F', 'F', 'F', 'F', 'F', 'F', 'F', 'F'
1858 #define D_3_4 'G', 'G', 'G', 'G', 'G', 'G', 'G', 'G'
1859 #define D_3_5 'H', 'H', 'H', 'H', 'H', 'H', 'H', 'H'
1860 #define D_3_6 'I', 'I', 'I', 'I', 'I', 'I', 'I', 'I'
1861 #define D_4 'J', 'J', 'J', 'J', 'J', 'J', 'J', 'J'
1862 #define D_5 'K', 'K', 'K', 'K', 'K', 'K', 'K', 'K'
1863 #define D_6 'L', 'L', 'L', 'L', 'L', 'L', 'L', 'L'
1864 #define D_7 'M', 'M', 'M', 'M', 'M', 'M', 'M', 'M'
1865 #define D_8 'N', 'N', 'N', 'N', 'N', 'N', 'N', 'N'
1866 #define D_9 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O'
1867 #define D_10 'P', 'P', 'P', 'P', 'P', 'P', 'P', 'P'
1868 #define D_11 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q', 'Q'
1871 DefragSturgesNovakBsdTest(
void)
1874 uint8_t expected[] = {
1906 static int DefragSturgesNovakBsdIpv6Test(
void)
1909 uint8_t expected[] = {
1940 static int DefragSturgesNovakLinuxIpv4Test(
void)
1943 uint8_t expected[] = {
1975 static int DefragSturgesNovakLinuxIpv6Test(
void)
1978 uint8_t expected[] = {
2009 static int DefragSturgesNovakWindowsIpv4Test(
void)
2012 uint8_t expected[] = {
2044 static int DefragSturgesNovakWindowsIpv6Test(
void)
2047 uint8_t expected[] = {
2078 static int DefragSturgesNovakSolarisTest(
void)
2081 uint8_t expected[] = {
2113 static int DefragSturgesNovakSolarisIpv6Test(
void)
2116 uint8_t expected[] = {
2147 static int DefragSturgesNovakFirstTest(
void)
2150 uint8_t expected[] = {
2182 static int DefragSturgesNovakFirstIpv6Test(
void)
2185 uint8_t expected[] = {
2216 DefragSturgesNovakLastTest(
void)
2219 uint8_t expected[] = {
2251 static int DefragSturgesNovakLastIpv6Test(
void)
2254 uint8_t expected[] = {
2285 static int DefragTimeoutTest(
void)
2295 for (i = 0; i < 16; i++) {
2296 Packet *
p = BuildIpv4TestPacket(IPPROTO_ICMP, i, 0, 1,
'A' + i, 16);
2306 Packet *
p = BuildIpv4TestPacket(IPPROTO_ICMP, 99, 0, 1,
'A' + i, 16);
2331 static int DefragNoDataIpv4Test(
void)
2339 dc = DefragContextNew();
2343 p = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 1, 0,
'A', 0);
2353 DefragContextDestroy(dc);
2360 static int DefragTooLargeIpv4Test(
void)
2367 dc = DefragContextNew();
2372 p = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 8183, 0,
'A', 71);
2385 DefragContextDestroy(dc);
2397 static int DefragVlanTest(
void)
2399 Packet *p1 = NULL, *p2 = NULL, *r = NULL;
2403 p1 = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 0, 1,
'A', 8);
2405 p2 = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 1, 0,
'B', 8);
2429 static int DefragVlanQinQTest(
void)
2431 Packet *p1 = NULL, *p2 = NULL, *r = NULL;
2435 p1 = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 0, 1,
'A', 8);
2437 p2 = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 1, 0,
'B', 8);
2463 static int DefragVlanQinQinQTest(
void)
2469 Packet *p1 = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 0, 1,
'A', 8);
2471 Packet *p2 = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 1, 0,
'B', 8);
2495 static int DefragTrackerReuseTest(
void)
2505 p1 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 0, 0,
'A', 8);
2518 FAIL_IF(tracker2 != tracker1);
2531 FAIL_IF(tracker2 != tracker1);
2548 static int DefragMfIpv4Test(
void)
2555 Packet *p1 = BuildIpv4TestPacket(IPPROTO_ICMP, ip_id, 2, 1,
'C', 8);
2556 Packet *p2 = BuildIpv4TestPacket(IPPROTO_ICMP, ip_id, 0, 1,
'A', 8);
2557 Packet *p3 = BuildIpv4TestPacket(IPPROTO_ICMP, ip_id, 1, 0,
'B', 8);
2558 FAIL_IF(p1 == NULL || p2 == NULL || p3 == NULL);
2575 uint8_t expected_payload[] =
"AAAAAAAABBBBBBBB";
2595 static int DefragMfIpv6Test(
void)
2602 Packet *p1 = BuildIpv6TestPacket(IPPROTO_ICMPV6, ip_id, 2, 1,
'C', 8);
2603 Packet *p2 = BuildIpv6TestPacket(IPPROTO_ICMPV6, ip_id, 0, 1,
'A', 8);
2604 Packet *p3 = BuildIpv6TestPacket(IPPROTO_ICMPV6, ip_id, 1, 0,
'B', 8);
2605 FAIL_IF(p1 == NULL || p2 == NULL || p3 == NULL);
2622 uint8_t expected_payload[] =
"AAAAAAAABBBBBBBB";
2637 static int DefragTestBadProto(
void)
2639 Packet *p1 = NULL, *p2 = NULL, *p3 = NULL;
2644 p1 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 8);
2646 p2 = BuildIpv4TestPacket(IPPROTO_UDP,
id, 1, 1,
'B', 8);
2648 p3 = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 2, 0,
'C', 3);
2667 static int DefragTestJeremyLinux(
void)
2670 uint8_t expected[] =
"AAAAAAAA"
2691 packets[0] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 0, 1,
'A', 24);
2692 packets[1] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 40 >> 3, 1,
'B', 48);
2693 packets[2] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 24 >> 3, 1,
'C', 48);
2694 packets[3] = BuildIpv4TestPacket(IPPROTO_ICMP,
id, 88 >> 3, 0,
'D', 14);
2710 for (i = 0; i < 4; i++) {
2729 static int DefragBsdFragmentAfterNoMfIpv4Test(
void)
2735 packets[0] = BuildIpv4TestPacket(IPPROTO_ICMP, 0x96, 24 >> 3, 0,
'A', 16);
2736 packets[1] = BuildIpv4TestPacket(IPPROTO_ICMP, 0x96, 8 >> 3, 1,
'B', 16);
2737 packets[2] = BuildIpv4TestPacket(IPPROTO_ICMP, 0x96, 16 >> 3, 1,
'C', 16);
2738 packets[3] = BuildIpv4TestPacket(IPPROTO_ICMP, 0x96, 0, 1,
'D', 8);
2753 uint8_t expected[] = {
2754 'D',
'D',
'D',
'D',
'D',
'D',
'D',
'D',
2755 'B',
'B',
'B',
'B',
'B',
'B',
'B',
'B',
2756 'B',
'B',
'B',
'B',
'B',
'B',
'B',
'B',
2757 'C',
'C',
'C',
'C',
'C',
'C',
'C',
'C',
2758 'A',
'A',
'A',
'A',
'A',
'A',
'A',
'A',
2762 if (memcmp(expected,
GET_PKT_DATA(r) + 20,
sizeof(expected)) != 0) {
2763 printf(
"Expected:\n");
2770 for (
int i = 0; i < 4; i++) {
2778 static int DefragBsdFragmentAfterNoMfIpv6Test(
void)
2784 packets[0] = BuildIpv6TestPacket(IPPROTO_ICMP, 0x96, 24 >> 3, 0,
'A', 16);
2785 packets[1] = BuildIpv6TestPacket(IPPROTO_ICMP, 0x96, 8 >> 3, 1,
'B', 16);
2786 packets[2] = BuildIpv6TestPacket(IPPROTO_ICMP, 0x96, 16 >> 3, 1,
'C', 16);
2787 packets[3] = BuildIpv6TestPacket(IPPROTO_ICMP, 0x96, 0, 1,
'D', 8);
2802 uint8_t expected[] = {
2803 'D',
'D',
'D',
'D',
'D',
'D',
'D',
'D',
2804 'B',
'B',
'B',
'B',
'B',
'B',
'B',
'B',
2805 'B',
'B',
'B',
'B',
'B',
'B',
'B',
'B',
2806 'C',
'C',
'C',
'C',
'C',
'C',
'C',
'C',
2807 'A',
'A',
'A',
'A',
'A',
'A',
'A',
'A',
2811 if (memcmp(expected,
GET_PKT_DATA(r) + 40,
sizeof(expected)) != 0) {
2812 printf(
"Expected:\n");
2819 for (
int i = 0; i < 4; i++) {
2827 static int DefragBsdSubsequentOverlapsStartOfOriginalIpv4Test_2(
void)
2835 &packets[0], IPPROTO_ICMP, 6, 16 >> 3, 1, (uint8_t *)
"AABBCCDDAABBDDCC", 16));
2839 &packets[1], IPPROTO_ICMP, 6, 8 >> 3, 1, (uint8_t *)
"AACCBBDDAACCDDBB", 16));
2843 &packets[2], IPPROTO_ICMP, 6, 0, 1, (uint8_t *)
"ZZZZZZZZ", 8));
2847 &packets[3], IPPROTO_ICMP, 6, 32 >> 3, 0, (uint8_t *)
"DDCCBBAA", 8));
2862 const uint8_t expected[] = {
2867 'A',
'A',
'C',
'C',
'B',
'B',
'D',
'D',
2868 'A',
'A',
'C',
'C',
'D',
'D',
'B',
'B',
2869 'A',
'A',
'B',
'B',
'D',
'D',
'C',
'C',
2870 'D',
'D',
'C',
'C',
'B',
'B',
'A',
'A',
2876 for (
int i = 0; i < 4; i++) {
2884 static int DefragBsdSubsequentOverlapsStartOfOriginalIpv6Test_2(
void)
2891 packets[0] = BuildIpv6TestPacketWithContent(
2892 IPPROTO_ICMP, 6, 16 >> 3, 1, (uint8_t *)
"AABBCCDDAABBDDCC", 16);
2895 packets[1] = BuildIpv6TestPacketWithContent(
2896 IPPROTO_ICMP, 6, 8 >> 3, 1, (uint8_t *)
"AACCBBDDAACCDDBB", 16);
2899 packets[2] = BuildIpv6TestPacketWithContent(IPPROTO_ICMP, 6, 0, 1, (uint8_t *)
"ZZZZZZZZ", 8);
2903 BuildIpv6TestPacketWithContent(IPPROTO_ICMP, 6, 32 >> 3, 0, (uint8_t *)
"DDCCBBAA", 8);
2918 const uint8_t expected[] = {
2923 'A',
'A',
'C',
'C',
'B',
'B',
'D',
'D',
2924 'A',
'A',
'C',
'C',
'D',
'D',
'B',
'B',
2925 'A',
'A',
'B',
'B',
'D',
'D',
'C',
'C',
2926 'D',
'D',
'C',
'C',
'B',
'B',
'A',
'A',
2932 for (
int i = 0; i < 4; i++) {
2952 static int DefragBsdSubsequentOverlapsStartOfOriginalIpv4Test(
void)
2958 packets[0] = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 8 >> 3, 0,
'E', 24);
2959 packets[1] = BuildIpv4TestPacket(IPPROTO_ICMP, 1, 0, 1,
'M', 24);
2968 const uint8_t expected[] = {
2969 'M',
'M',
'M',
'M',
'M',
'M',
'M',
'M',
2970 'M',
'M',
'M',
'M',
'M',
'M',
'M',
'M',
2971 'M',
'M',
'M',
'M',
'M',
'M',
'M',
'M',
2972 'E',
'E',
'E',
'E',
'E',
'E',
'E',
'E',
2976 if (memcmp(expected,
GET_PKT_DATA(r) + 20,
sizeof(expected)) != 0) {
2977 printf(
"Expected:\n");
2984 for (
int i = 0; i < 2; i++) {
2992 static int DefragBsdSubsequentOverlapsStartOfOriginalIpv6Test(
void)
2998 packets[0] = BuildIpv6TestPacket(IPPROTO_ICMP, 1, 8 >> 3, 0,
'E', 24);
2999 packets[1] = BuildIpv6TestPacket(IPPROTO_ICMP, 1, 0, 1,
'M', 24);
3008 const uint8_t expected[] = {
3009 'M',
'M',
'M',
'M',
'M',
'M',
'M',
'M',
3010 'M',
'M',
'M',
'M',
'M',
'M',
'M',
'M',
3011 'M',
'M',
'M',
'M',
'M',
'M',
'M',
'M',
3012 'E',
'E',
'E',
'E',
'E',
'E',
'E',
'E',
3016 if (memcmp(expected,
GET_PKT_DATA(r) + 40,
sizeof(expected)) != 0) {
3017 printf(
"Expected:\n");
3024 for (
int i = 0; i < 2; i++) {
3043 static int DefragBsdMissingFragmentIpv4Test(
void)
3050 &packets[0], IPPROTO_ICMP, 189, 16 >> 3, 1, (uint8_t *)
"AABBCCDDAABBDDCC", 16));
3053 &packets[1], IPPROTO_ICMP, 189, 40 >> 3, 1, (uint8_t *)
"AACCBBDD", 8));
3056 &packets[2], IPPROTO_ICMP, 189, 8 >> 3, 1, (uint8_t *)
"AACCDDBBAADDBBCC", 16));
3060 &packets[3], IPPROTO_ICMP, 189, 0, 1, (uint8_t *)
"ZZZZZZZZ", 8));
3063 &packets[4], IPPROTO_ICMP, 189, 48 >> 3, 0, (uint8_t *)
"DDCCBBAA", 8));
3084 for (
int i = 0; i < 5; i++) {
3091 static int DefragBsdMissingFragmentIpv6Test(
void)
3097 packets[0] = BuildIpv6TestPacketWithContent(
3098 IPPROTO_ICMP, 189, 16 >> 3, 1, (uint8_t *)
"AABBCCDDAABBDDCC", 16);
3101 BuildIpv6TestPacketWithContent(IPPROTO_ICMP, 189, 40 >> 3, 1, (uint8_t *)
"AACCBBDD", 8);
3103 packets[2] = BuildIpv6TestPacketWithContent(
3104 IPPROTO_ICMP, 189, 8 >> 3, 1, (uint8_t *)
"AACCDDBBAADDBBCC", 16);
3107 packets[3] = BuildIpv6TestPacketWithContent(IPPROTO_ICMP, 189, 0, 1, (uint8_t *)
"ZZZZZZZZ", 8);
3110 BuildIpv6TestPacketWithContent(IPPROTO_ICMP, 189, 48 >> 3, 0, (uint8_t *)
"DDCCBBAA", 8);
3131 for (
int i = 0; i < 5; i++) {
3143 UtRegisterTest(
"DefragInOrderSimpleTest", DefragInOrderSimpleTest);
3144 UtRegisterTest(
"DefragReverseSimpleTest", DefragReverseSimpleTest);
3145 UtRegisterTest(
"DefragSturgesNovakBsdTest", DefragSturgesNovakBsdTest);
3147 DefragSturgesNovakLinuxIpv4Test);
3149 DefragSturgesNovakWindowsIpv4Test);
3151 DefragSturgesNovakSolarisTest);
3152 UtRegisterTest(
"DefragSturgesNovakFirstTest", DefragSturgesNovakFirstTest);
3153 UtRegisterTest(
"DefragSturgesNovakLastTest", DefragSturgesNovakLastTest);
3156 UtRegisterTest(
"DefragTooLargeIpv4Test", DefragTooLargeIpv4Test);
3158 UtRegisterTest(
"DefragInOrderSimpleIpv6Test", DefragInOrderSimpleIpv6Test);
3159 UtRegisterTest(
"DefragReverseSimpleIpv6Test", DefragReverseSimpleIpv6Test);
3160 UtRegisterTest(
"DefragSturgesNovakBsdIpv6Test", DefragSturgesNovakBsdIpv6Test);
3161 UtRegisterTest(
"DefragSturgesNovakLinuxIpv6Test", DefragSturgesNovakLinuxIpv6Test);
3162 UtRegisterTest(
"DefragSturgesNovakWindowsIpv6Test", DefragSturgesNovakWindowsIpv6Test);
3163 UtRegisterTest(
"DefragSturgesNovakSolarisIpv6Test", DefragSturgesNovakSolarisIpv6Test);
3164 UtRegisterTest(
"DefragSturgesNovakFirstIpv6Test", DefragSturgesNovakFirstIpv6Test);
3165 UtRegisterTest(
"DefragSturgesNovakLastIpv6Test", DefragSturgesNovakLastIpv6Test);
3170 UtRegisterTest(
"DefragTrackerReuseTest", DefragTrackerReuseTest);
3178 UtRegisterTest(
"DefragBsdFragmentAfterNoMfIpv4Test", DefragBsdFragmentAfterNoMfIpv4Test);
3179 UtRegisterTest(
"DefragBsdFragmentAfterNoMfIpv6Test", DefragBsdFragmentAfterNoMfIpv6Test);
3180 UtRegisterTest(
"DefragBsdSubsequentOverlapsStartOfOriginalIpv4Test",
3181 DefragBsdSubsequentOverlapsStartOfOriginalIpv4Test);
3182 UtRegisterTest(
"DefragBsdSubsequentOverlapsStartOfOriginalIpv6Test",
3183 DefragBsdSubsequentOverlapsStartOfOriginalIpv6Test);
3184 UtRegisterTest(
"DefragBsdSubsequentOverlapsStartOfOriginalIpv4Test_2",
3185 DefragBsdSubsequentOverlapsStartOfOriginalIpv4Test_2);
3186 UtRegisterTest(
"DefragBsdSubsequentOverlapsStartOfOriginalIpv6Test_2",
3187 DefragBsdSubsequentOverlapsStartOfOriginalIpv6Test_2);
3188 UtRegisterTest(
"DefragBsdMissingFragmentIpv4Test", DefragBsdMissingFragmentIpv4Test);
3189 UtRegisterTest(
"DefragBsdMissingFragmentIpv6Test", DefragBsdMissingFragmentIpv6Test);