diff --git a/src/ethernetII.cpp b/src/ethernetII.cpp index bc54543..1502d99 100644 --- a/src/ethernetII.cpp +++ b/src/ethernetII.cpp @@ -179,6 +179,9 @@ void EthernetII::write_serialization(uint8_t* buffer, uint32_t total_sz, const P payload_type(static_cast(flag)); } } + else { + payload_type(Constants::Ethernet::UNKNOWN); + } stream.write(header_); const uint32_t trailer = trailer_size(); if (trailer) { diff --git a/tests/src/ethernetII.cpp b/tests/src/ethernetII.cpp index 40f29ae..0307685 100644 --- a/tests/src/ethernetII.cpp +++ b/tests/src/ethernetII.cpp @@ -116,14 +116,6 @@ TEST_F(EthernetIITest, CompleteConstructor) { EXPECT_EQ(eth.payload_type(), 0); } -TEST_F(EthernetIITest, Serialize) { - EthernetII eth(dst_addr, src_addr); - eth.payload_type(p_type); - PDU::serialization_type serialized = eth.serialize(); - ASSERT_EQ(serialized.size(), sizeof(expected_packet)); - EXPECT_TRUE(std::equal(serialized.begin(), serialized.end(), expected_packet)); -} - TEST_F(EthernetIITest, SerializeSmallEthernetWithPadding) { EthernetII eth(smallip_packet, sizeof(smallip_packet)); ASSERT_TRUE(eth.inner_pdu() != NULL); @@ -167,4 +159,17 @@ TEST_F(EthernetIITest, SerializePreservesGivenPayloadType) { eth.payload_type(p_type); eth.serialize(); EXPECT_EQ(p_type, eth.payload_type()); -} \ No newline at end of file +} + +// Issue #168 +TEST_F(EthernetIITest, SerializeWhenInnerPDUIsGone) { + EthernetII eth1 = EthernetII() / IP(); + eth1.serialize(); // sets payload type + eth1.inner_pdu(NULL); // make it "incomplete" + PDU::serialization_type buffer = eth1.serialize(); + + EXPECT_EQ(eth1.size(), buffer.size()); + + EthernetII eth2(&buffer[0], buffer.size()); + EXPECT_EQ(eth1.size(), eth2.size()); +}