From 05f06df832f1a9da671d431c19191c47ec48e722 Mon Sep 17 00:00:00 2001 From: Sergei Trofimovich Date: Fri, 17 Nov 2017 23:40:20 +0000 Subject: [PATCH] nd_opt_6co: use uint8_t as a bitfield to be endianness-agnostic Bug: https://github.com/reubenhwk/radvd/issues/77 Signed-off-by: Sergei Trofimovich --- radvd.h | 4 +--- send.c | 4 ++-- test/send.c | 3 +-- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/radvd.h b/radvd.h index 89a5b9e..f520f24 100644 --- a/radvd.h +++ b/radvd.h @@ -259,9 +259,7 @@ struct nd_opt_6co { uint8_t nd_opt_6co_type; uint8_t nd_opt_6co_len; uint8_t nd_opt_6co_context_len; - uint8_t nd_opt_6co_res : 3; - uint8_t nd_opt_6co_c : 1; - uint8_t nd_opt_6co_cid : 4; + uint8_t nd_opt_6co_res_c_cid; /* [ res=3-bits | c=1-bit | cid=4-bits ] */ uint16_t nd_opt_6co_reserved; uint16_t nd_opt_6co_valid_lifetime; struct in6_addr nd_opt_6co_con_prefix; diff --git a/send.c b/send.c index 8bc16a8..d44f85c 100644 --- a/send.c +++ b/send.c @@ -619,8 +619,8 @@ static void add_ra_option_lowpanco(struct safe_buffer *sb, struct AdvLowpanCo co co.nd_opt_6co_type = ND_OPT_6CO; co.nd_opt_6co_len = 3; co.nd_opt_6co_context_len = lowpanco->ContextLength; - co.nd_opt_6co_c = lowpanco->ContextCompressionFlag; - co.nd_opt_6co_cid = lowpanco->AdvContextID; + co.nd_opt_6co_res_c_cid = ((lowpanco->ContextCompressionFlag ? 1 : 0) << 4) + | (lowpanco->AdvContextID & 0x0F); co.nd_opt_6co_valid_lifetime = lowpanco->AdvLifeTime; co.nd_opt_6co_con_prefix = lowpanco->AdvContextPrefix; diff --git a/test/send.c b/test/send.c index 92fe45b..4124986 100644 --- a/test/send.c +++ b/test/send.c @@ -309,10 +309,9 @@ START_TEST(test_add_ra_option_lowpanco) ck_assert_msg(0, "\n%s", &buf); #else unsigned char expected[] = { - 0x22, 0x03, 0x32, 0x48, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x22, 0x03, 0x32, 0x14, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; - ck_assert_int_eq(sb.used, sizeof(expected)); ck_assert_int_eq(0, memcmp(expected, sb.buffer, sizeof(expected))); #endif diff --git a/test/send.c b/test/send.c index 4124986..b194449 100644 --- a/test/send.c +++ b/test/send.c @@ -309,7 +309,7 @@ START_TEST(test_add_ra_option_lowpanco) ck_assert_msg(0, "\n%s", &buf); #else unsigned char expected[] = { - 0x22, 0x03, 0x32, 0x14, 0x00, 0x00, 0xe8, 0x03, 0x00, 0x00, 0x00, 0x00, + 0x22, 0x03, 0x32, 0x14, 0x00, 0x00, 0x03, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; ck_assert_int_eq(sb.used, sizeof(expected)); @@ -333,7 +333,7 @@ START_TEST(test_add_ra_option_abro) ck_assert_msg(0, "\n%s", &buf); #else unsigned char expected[] = { - 0x23, 0x03, 0x0a, 0x00, 0x02, 0x00, 0x02, 0x00, 0xfe, 0x80, 0x00, 0x00, + 0x23, 0x03, 0x00, 0x0a, 0x00, 0x02, 0x00, 0x02, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, };