1
0
mirror of https://github.com/mfontanini/libtins synced 2026-01-23 02:35:57 +01:00

Fragmented IP packet's inner_pdu PDUs are not decoded now.

This commit is contained in:
Matias Fontanini
2013-11-16 19:40:08 -03:00
parent dc6c37777b
commit a6655191d4
2 changed files with 34 additions and 15 deletions

View File

@@ -117,24 +117,31 @@ IP::IP(const uint8_t *buffer, uint32_t total_sz)
throw malformed_packet();
total_sz -= head_len() * sizeof(uint32_t);
if (total_sz) {
inner_pdu(
Internals::pdu_from_flag(
static_cast<Constants::IP::e>(_ip.protocol),
buffer,
total_sz,
false
)
);
if(!inner_pdu()) {
// Don't try to decode it if it's fragmented
if(frag_off() == 0 || frag_off() == 0x4000) {
inner_pdu(
Internals::allocate<IP>(
_ip.protocol,
Internals::pdu_from_flag(
static_cast<Constants::IP::e>(_ip.protocol),
buffer,
total_sz
total_sz,
false
)
);
if(!inner_pdu())
inner_pdu(new RawPDU(buffer, total_sz));
if(!inner_pdu()) {
inner_pdu(
Internals::allocate<IP>(
_ip.protocol,
buffer,
total_sz
)
);
if(!inner_pdu())
inner_pdu(new RawPDU(buffer, total_sz));
}
}
else {
// It's fragmented, just use RawPDU
inner_pdu(new RawPDU(buffer, total_sz));
}
}
}

View File

@@ -14,7 +14,7 @@ using namespace Tins;
class IPTest : public testing::Test {
public:
static const uint8_t expected_packet[];
static const uint8_t expected_packet[], fragmented_packet[];
void test_equals(const IP &ip1, const IP &ip2);
};
@@ -24,6 +24,12 @@ const uint8_t IPTest::expected_packet[] = {
168, 9, 43, 130, 11, 116, 106, 103, 171, 119, 171, 104, 101, 108, 0
};
const uint8_t IPTest::fragmented_packet[] = {
69, 0, 0, 60, 0, 242, 7, 223, 64, 17, 237, 220, 192, 0, 2, 1, 192,
0, 2, 2, 192, 0, 192, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
TEST_F(IPTest, DefaultConstructor) {
IP ip;
@@ -63,6 +69,12 @@ TEST_F(IPTest, Constructor) {
EXPECT_EQ(ip.id(), 1);
}
TEST_F(IPTest, ConstructorFromFragmentedPacket) {
IP ip(fragmented_packet, sizeof(fragmented_packet));
ASSERT_TRUE(ip.inner_pdu());
EXPECT_EQ(PDU::RAW, ip.inner_pdu()->pdu_type());
}
TEST_F(IPTest, TOS) {
IP ip;
ip.tos(0x7a);