diff --git a/src/ip.cpp b/src/ip.cpp index d3a8276..8969fb3 100644 --- a/src/ip.cpp +++ b/src/ip.cpp @@ -177,7 +177,7 @@ void IP::init_ip_fields() { } bool IP::is_fragmented() const { - return flags() == IP::MORE_FRAGMENTS || fragment_offset() != 0; + return (flags() & IP::MORE_FRAGMENTS) != 0 || fragment_offset() != 0; } // Setters diff --git a/src/ip_reassembler.cpp b/src/ip_reassembler.cpp index 4b53045..02e355e 100644 --- a/src/ip_reassembler.cpp +++ b/src/ip_reassembler.cpp @@ -55,7 +55,8 @@ void IPv4Stream::add_fragment(IP* ip) { } fragments_.insert(it, IPv4Fragment(ip->inner_pdu(), offset)); received_size_ += ip->inner_pdu()->size(); - if (ip->flags() != IP::MORE_FRAGMENTS) { + // If the MF flag is off + if ((ip->flags() & IP::MORE_FRAGMENTS) == 0) { total_size_ = offset + ip->inner_pdu()->size(); received_end_ = true; } diff --git a/tests/src/ip_reassembler.cpp b/tests/src/ip_reassembler.cpp index 4bca051..68b9832 100644 --- a/tests/src/ip_reassembler.cpp +++ b/tests/src/ip_reassembler.cpp @@ -5,6 +5,7 @@ #include "ip_reassembler.h" #include "ethernetII.h" #include "udp.h" +#include "ip.h" #include "rawpdu.h" using namespace Tins; @@ -74,3 +75,30 @@ TEST_F(IPv4ReassemblerTest, Reassemble) { test_packets(vt); } } + +TEST_F(IPv4ReassemblerTest, PacketHasMFAndDF) { + const uint8_t raw_packet1[] = { + 0, 80, 86, 173, 75, 110, 170, 0, 4, 0, 10, 4, 8, 0, 69, 0, 0, 124, 146, + 205, 96, 0, 64, 6, 107, 153, 7, 7, 7, 7, 7, 7, 7, 1, 152, 191, 0, 80, + 160, 119, 38, 106, 125, 14, 42, 154, 128, 24, 0, 115, 148, 65, 0, 0, 1, + 1, 8, 10, 4, 255, 180, 163, 4, 255, 176, 151, 71, 69, 84, 32, 47, 49, 46, + 104, 116, 109, 108, 63, 32, 72, 84, 84, 80, 47, 49, 46, 49, 13, 10, 85, + 115, 101, 114, 45, 65, 103, 101, 110, 116, 58, 32, 87, 103, 101, 116, + 47, 49, 46, 49, 51, 46, 52, 32, 40, 108, 105, 110, 117, 120, 45, 103, + 110, 117, 41, 13, 10, 65, 99, 99, 101, 112, 116, 58, 32, 42, 47, 42, 13 + }; + const uint8_t raw_packet2[] = { + 0, 80, 86, 173, 75, 110, 170, 0, 4, 0, 10, 4, 8, 0, 69, 0, 0, 62, 146, + 205, 64, 13, 64, 6, 139, 202, 7, 7, 7, 7, 7, 7, 7, 1, 10, 72, 111, 115, + 116, 58, 32, 55, 46, 55, 46, 55, 46, 49, 13, 10, 67, 111, 110, 110, + 101, 99, 116, 105, 111, 110, 58, 32, 75, 101, 101, 112, 45, 65, 108, + 105, 118, 101, 13, 10, 13, 10 + }; + EthernetII packet1(raw_packet1, sizeof(raw_packet1)); + EthernetII packet2(raw_packet2, sizeof(raw_packet2)); + EXPECT_TRUE(packet1.rfind_pdu().is_fragmented()); + EXPECT_TRUE(packet2.rfind_pdu().is_fragmented()); + IPv4Reassembler reassembler; + EXPECT_EQ(IPv4Reassembler::FRAGMENTED, reassembler.process(packet1)); + EXPECT_EQ(IPv4Reassembler::REASSEMBLED, reassembler.process(packet2)); +}