mirror of
https://github.com/mfontanini/libtins
synced 2026-01-23 02:35:57 +01:00
@@ -356,6 +356,7 @@ private:
|
|||||||
uint32_t calculate_headers_size() const;
|
uint32_t calculate_headers_size() const;
|
||||||
static void write_header(const ext_header& header, Memory::OutputMemoryStream& stream);
|
static void write_header(const ext_header& header, Memory::OutputMemoryStream& stream);
|
||||||
static bool is_extension_header(uint8_t header_id);
|
static bool is_extension_header(uint8_t header_id);
|
||||||
|
static uint32_t get_padding_size(const ext_header& header);
|
||||||
|
|
||||||
TINS_BEGIN_PACK
|
TINS_BEGIN_PACK
|
||||||
struct ipv6_header {
|
struct ipv6_header {
|
||||||
|
|||||||
@@ -164,6 +164,11 @@ bool IPv6::is_extension_header(uint8_t header_id) {
|
|||||||
|| header_id == MOBILITY || header_id == NO_NEXT_HEADER;
|
|| header_id == MOBILITY || header_id == NO_NEXT_HEADER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t IPv6::get_padding_size(const ext_header& header) {
|
||||||
|
const uint32_t padding = (header.data_size() + sizeof(uint8_t) * 2) % 8;
|
||||||
|
return padding == 0 ? 0 : (8 - padding);
|
||||||
|
}
|
||||||
|
|
||||||
void IPv6::version(small_uint<4> new_version) {
|
void IPv6::version(small_uint<4> new_version) {
|
||||||
header_.version = new_version;
|
header_.version = new_version;
|
||||||
}
|
}
|
||||||
@@ -337,6 +342,8 @@ uint32_t IPv6::calculate_headers_size() const {
|
|||||||
uint32_t output = 0;
|
uint32_t output = 0;
|
||||||
for (const_iterator iter = ext_headers_.begin(); iter != ext_headers_.end(); ++iter) {
|
for (const_iterator iter = ext_headers_.begin(); iter != ext_headers_.end(); ++iter) {
|
||||||
output += static_cast<uint32_t>(iter->data_size() + sizeof(uint8_t) * 2);
|
output += static_cast<uint32_t>(iter->data_size() + sizeof(uint8_t) * 2);
|
||||||
|
output += get_padding_size(*iter);
|
||||||
|
|
||||||
}
|
}
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
@@ -346,6 +353,8 @@ void IPv6::write_header(const ext_header& header, OutputMemoryStream& stream) {
|
|||||||
stream.write(header.option());
|
stream.write(header.option());
|
||||||
stream.write(length);
|
stream.write(length);
|
||||||
stream.write(header.data_ptr(), header.data_size());
|
stream.write(header.data_ptr(), header.data_size());
|
||||||
|
// Append padding
|
||||||
|
stream.fill(get_padding_size(header), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // Tins
|
} // Tins
|
||||||
|
|||||||
@@ -360,3 +360,9 @@ TEST_F(IPv6Test, OptionAddition) {
|
|||||||
EXPECT_TRUE(ipv6.search_header(IPv6::ROUTING) != 0);
|
EXPECT_TRUE(ipv6.search_header(IPv6::ROUTING) != 0);
|
||||||
EXPECT_TRUE(ipv6.search_header(IPv6::AUTHENTICATION) != 0);
|
EXPECT_TRUE(ipv6.search_header(IPv6::AUTHENTICATION) != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(IPv6Test, HopByHopPadding) {
|
||||||
|
IPv6 ipv6_header;
|
||||||
|
ipv6_header.add_header(IPv6::ExtensionHeader::HOP_BY_HOP);
|
||||||
|
EXPECT_EQ(48UL, ipv6_header.serialize().size());
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user