summaryrefslogtreecommitdiff
blob: 09fb29f9e318d7acf31f78acbdd8748b62b23e90 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
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,