nd_opt_6co: fix serialization Bug: https://github.com/reubenhwk/radvd/issues/77 Bug: https://bugs.gentoo.org/637958 --- a/radvd.h +++ b/radvd.h @@ -261,5 +261,3 @@ struct nd_opt_6co { 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; --- a/send.c +++ b/send.c @@ -621,5 +621,5 @@ static void add_ra_option_lowpanco(struct safe_buffer *sb, struct AdvLowpanCo co 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_valid_lifetime = lowpanco->AdvLifeTime; + co.nd_opt_6co_res_c_cid = ((lowpanco->ContextCompressionFlag ? 1 : 0) << 4) + | (lowpanco->AdvContextID & 0x0F); + co.nd_opt_6co_valid_lifetime = htons(lowpanco->AdvLifeTime); co.nd_opt_6co_con_prefix = lowpanco->AdvContextPrefix; @@ -637,5 +637,5 @@ static void add_ra_option_abro(struct safe_buffer *sb, struct AdvAbro const *abr abro.nd_opt_abro_len = 3; - abro.nd_opt_abro_ver_low = abroo->Version[1]; - abro.nd_opt_abro_ver_high = abroo->Version[0]; - abro.nd_opt_abro_valid_lifetime = abroo->ValidLifeTime; + abro.nd_opt_abro_ver_low = htons(abroo->Version[1]); + abro.nd_opt_abro_ver_high = htons(abroo->Version[0]); + abro.nd_opt_abro_valid_lifetime = htons(abroo->ValidLifeTime); abro.nd_opt_abro_6lbr_address = abroo->LBRaddress; --- a/test/send.c +++ b/test/send.c @@ -311,6 +311,5 @@ START_TEST(test_add_ra_option_lowpanco) unsigned char expected[] = { - 0x22, 0x03, 0x32, 0x48, 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)); @@ -336,3 +335,3 @@ START_TEST(test_add_ra_option_abro) 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,