Skip to content

Commit

Permalink
Fixed some endianness bugs on ICMPv6 and PPI.
Browse files Browse the repository at this point in the history
  • Loading branch information
mfontanini committed Jan 19, 2014
1 parent 853e1ce commit 6d7e065
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 28 deletions.
4 changes: 2 additions & 2 deletions include/ppi.h
Original file line number Diff line number Diff line change
Expand Up @@ -85,15 +85,15 @@ class PPI : public PDU {
* \return The stored length field value.
*/
uint16_t length() const {
return _header.length;
return Endian::le_to_host(_header.length);
}

/**
* \brief Getter for the Data Link Type field.
* \return The stored Data Link Type field value.
*/
uint32_t dlt() const {
return _header.dlt;
return Endian::le_to_host(_header.dlt);
}

/**
Expand Down
44 changes: 23 additions & 21 deletions src/icmpv6.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -300,39 +300,41 @@ void ICMPv6::redirect_header(const byte_array& data) {

void ICMPv6::mtu(const mtu_type& value) {
uint8_t buffer[sizeof(uint16_t) + sizeof(uint32_t)] = {0};
const uint16_t u16_tmp = Endian::host_to_be(value.first);
const uint32_t u32_tmp = Endian::host_to_be(value.second);
buffer[0] = u16_tmp & 0xff;
buffer[1] = u16_tmp >> 8;
buffer[2] = u32_tmp & 0xff;
buffer[3] = u32_tmp >> 8;
buffer[4] = u32_tmp >> 16;
buffer[5] = u32_tmp >> 24;
const uint16_t u16_tmp = value.first;
const uint32_t u32_tmp = value.second;
buffer[0] = u16_tmp >> 8;
buffer[1] = u16_tmp & 0xff;

buffer[2] = u32_tmp >> 24;
buffer[3] = u32_tmp >> 16;
buffer[4] = u32_tmp >> 8;
buffer[5] = u32_tmp & 0xff;
add_option(option(MTU, sizeof(buffer), buffer));
}

void ICMPv6::shortcut_limit(const shortcut_limit_type &value) {
uint8_t buffer[sizeof(uint16_t) + sizeof(uint32_t)] = {0};
const uint32_t u32_tmp = Endian::host_to_be(value.reserved2);
const uint32_t u32_tmp = value.reserved2;
buffer[0] = value.limit;
buffer[1] = value.reserved1;
buffer[2] = u32_tmp & 0xff;
buffer[3] = u32_tmp >> 8;
buffer[4] = u32_tmp >> 16;
buffer[5] = u32_tmp >> 24;
buffer[2] = u32_tmp >> 24;
buffer[3] = u32_tmp >> 16;
buffer[4] = u32_tmp >> 8;
buffer[5] = u32_tmp & 0xff;
add_option(option(NBMA_SHORT_LIMIT, sizeof(buffer), buffer));
}

void ICMPv6::new_advert_interval(const new_advert_interval_type &value) {
uint8_t buffer[sizeof(uint16_t) + sizeof(uint32_t)] = {0};
const uint16_t u16_tmp = Endian::host_to_be(value.reserved);
const uint32_t u32_tmp = Endian::host_to_be(value.interval);
buffer[0] = u16_tmp & 0xff;
buffer[1] = u16_tmp >> 8;
buffer[2] = u32_tmp & 0xff;
buffer[3] = u32_tmp >> 8;
buffer[4] = u32_tmp >> 16;
buffer[5] = u32_tmp >> 24;
const uint16_t u16_tmp = value.reserved;
const uint32_t u32_tmp = value.interval;
buffer[0] = u16_tmp >> 8;
buffer[1] = u16_tmp & 0xff;

buffer[2] = u32_tmp >> 24;
buffer[3] = u32_tmp >> 16;
buffer[4] = u32_tmp >> 8;
buffer[5] = u32_tmp & 0xff;
add_option(option(ADVERT_INTERVAL, sizeof(buffer), buffer));
}

Expand Down
15 changes: 10 additions & 5 deletions tests/src/icmpv6.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -223,19 +223,24 @@ TEST_F(ICMPv6Test, MTU) {

TEST_F(ICMPv6Test, ShortcutLimit) {
ICMPv6 icmp;
icmp.shortcut_limit(123);
ICMPv6::shortcut_limit_type slimit(123);
slimit.reserved1 = 0x7f;
slimit.reserved2 = 0x12345678;
icmp.shortcut_limit(slimit);
ICMPv6::shortcut_limit_type sl = icmp.shortcut_limit();
EXPECT_EQ(123, sl.limit);
EXPECT_EQ(0, sl.reserved1);
EXPECT_EQ(0, sl.reserved2);
EXPECT_EQ(0x7f, sl.reserved1);
EXPECT_EQ(0x12345678, sl.reserved2);
}

TEST_F(ICMPv6Test, NewAdvertisementInterval) {
ICMPv6 icmp;
icmp.new_advert_interval(0x9a8df7);
ICMPv6::new_advert_interval_type adv(0x9a8df7);
adv.reserved = 0x1234;
icmp.new_advert_interval(adv);
ICMPv6::new_advert_interval_type data = icmp.new_advert_interval();
EXPECT_EQ(0x9a8df7U, data.interval);
EXPECT_EQ(0, data.reserved);
EXPECT_EQ(0x1234, data.reserved);
}

TEST_F(ICMPv6Test, NewHomeAgentInformation) {
Expand Down

0 comments on commit 6d7e065

Please sign in to comment.