1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
3 Copyright © 2017 Intel Corporation. All rights reserved.
6 #include <netinet/icmp6.h>
12 #include "alloc-util.h"
13 #include "hexdecoct.h"
14 #include "icmp6-util-unix.h"
15 #include "socket-util.h"
19 static struct ether_addr mac_addr
= {
20 .ether_addr_octet
= { 0x78, 0x2b, 0xcb, 0xb3, 0x6d, 0x53 }
23 static bool test_stopped
;
25 struct in6_addr address
;
26 unsigned char prefixlen
;
31 { { { { 0x20, 0x01, 0x0d, 0xb8, 0xde, 0xad, 0xbe, 0xef,
32 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 64,
34 { { { { 0x20, 0x01, 0x0d, 0xb8, 0x0b, 0x16, 0xd0, 0x0d,
35 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 64,
36 /* indicate default valid and preferred lifetimes for the test code */
38 { { { { 0x20, 0x01, 0x0d, 0xb8, 0x0b, 0x16, 0xd0, 0x0d,
39 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 58,
41 /* indicate that this prefix already exists */
43 { { { { 0x20, 0x01, 0x0d, 0xb8, 0x0b, 0x16, 0xd0, 0x0d,
44 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 120,
46 /* indicate that this prefix already exists */
48 { { { { 0x20, 0x01, 0x0d, 0xb8, 0x0b, 0x16, 0xd0, 0x0d,
49 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 12,
51 /* indicate that this prefix already exists */
53 { { { { 0x20, 0x01, 0x0d, 0xb8, 0xc0, 0x01, 0x0d, 0xad,
54 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 48,
56 { { { { 0x20, 0x01, 0x0d, 0xb8, 0xc0, 0x01, 0x0d, 0xad,
57 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } } }, 60,
59 /* indicate that this prefix already exists */
63 static const struct in6_addr test_rdnss
= { { { 0x20, 0x01, 0x0d, 0xb8,
64 0xde, 0xad, 0xbe, 0xef,
65 0x00, 0x00, 0x00, 0x00,
66 0x00, 0x00, 0x00, 0x01 } } };
67 static const char *test_dnssl
[] = { "lab.intra",
73 assert_se(sd_radv_prefix_new(&p
) >= 0);
75 ASSERT_RETURN_EXPECTED_SE(sd_radv_prefix_set_onlink(NULL
, true) < 0);
76 assert_se(sd_radv_prefix_set_onlink(p
, true) >= 0);
77 assert_se(sd_radv_prefix_set_onlink(p
, false) >= 0);
79 ASSERT_RETURN_EXPECTED_SE(sd_radv_prefix_set_address_autoconfiguration(NULL
, true) < 0);
80 assert_se(sd_radv_prefix_set_address_autoconfiguration(p
, true) >= 0);
81 assert_se(sd_radv_prefix_set_address_autoconfiguration(p
, false) >= 0);
83 ASSERT_RETURN_EXPECTED_SE(sd_radv_prefix_set_valid_lifetime(NULL
, 1, 1) < 0);
84 assert_se(sd_radv_prefix_set_valid_lifetime(p
, 0, 0) >= 0);
85 assert_se(sd_radv_prefix_set_valid_lifetime(p
, 300 * USEC_PER_SEC
, USEC_INFINITY
) >= 0);
86 assert_se(sd_radv_prefix_set_valid_lifetime(p
, 300 * USEC_PER_SEC
, USEC_PER_YEAR
) >= 0);
88 ASSERT_RETURN_EXPECTED_SE(sd_radv_prefix_set_preferred_lifetime(NULL
, 1, 1) < 0);
89 assert_se(sd_radv_prefix_set_preferred_lifetime(p
, 0, 0) >= 0);
90 assert_se(sd_radv_prefix_set_preferred_lifetime(p
, 300 * USEC_PER_SEC
, USEC_INFINITY
) >= 0);
91 assert_se(sd_radv_prefix_set_preferred_lifetime(p
, 300 * USEC_PER_SEC
, USEC_PER_YEAR
) >= 0);
93 ASSERT_RETURN_EXPECTED_SE(sd_radv_prefix_set_prefix(NULL
, NULL
, 0) < 0);
94 ASSERT_RETURN_EXPECTED_SE(sd_radv_prefix_set_prefix(p
, NULL
, 0) < 0);
96 assert_se(sd_radv_prefix_set_prefix(p
, &prefix
[0].address
, 64) >= 0);
97 assert_se(sd_radv_prefix_set_prefix(p
, &prefix
[0].address
, 0) < 0);
98 assert_se(sd_radv_prefix_set_prefix(p
, &prefix
[0].address
, 1) < 0);
99 assert_se(sd_radv_prefix_set_prefix(p
, &prefix
[0].address
, 2) < 0);
100 assert_se(sd_radv_prefix_set_prefix(p
, &prefix
[0].address
, 3) >= 0);
101 assert_se(sd_radv_prefix_set_prefix(p
, &prefix
[0].address
, 125) >= 0);
102 assert_se(sd_radv_prefix_set_prefix(p
, &prefix
[0].address
, 128) >= 0);
103 ASSERT_RETURN_EXPECTED_SE(sd_radv_prefix_set_prefix(p
, &prefix
[0].address
, 129) < 0);
104 ASSERT_RETURN_EXPECTED_SE(sd_radv_prefix_set_prefix(p
, &prefix
[0].address
, 255) < 0);
106 assert_se(!sd_radv_prefix_unref(p
));
109 TEST(radv_route_prefix
) {
110 sd_radv_route_prefix
*p
;
112 assert_se(sd_radv_route_prefix_new(&p
) >= 0);
114 ASSERT_RETURN_EXPECTED_SE(sd_radv_route_prefix_set_lifetime(NULL
, 1, 1) < 0);
115 assert_se(sd_radv_route_prefix_set_lifetime(p
, 0, 0) >= 0);
116 assert_se(sd_radv_route_prefix_set_lifetime(p
, 300 * USEC_PER_SEC
, USEC_INFINITY
) >= 0);
117 assert_se(sd_radv_route_prefix_set_lifetime(p
, 300 * USEC_PER_SEC
, USEC_PER_YEAR
) >= 0);
119 ASSERT_RETURN_EXPECTED_SE(sd_radv_route_prefix_set_prefix(NULL
, NULL
, 0) < 0);
120 ASSERT_RETURN_EXPECTED_SE(sd_radv_route_prefix_set_prefix(p
, NULL
, 0) < 0);
122 assert_se(sd_radv_route_prefix_set_prefix(p
, &prefix
[0].address
, 64) >= 0);
123 assert_se(sd_radv_route_prefix_set_prefix(p
, &prefix
[0].address
, 0) >= 0);
124 assert_se(sd_radv_route_prefix_set_prefix(p
, &prefix
[0].address
, 1) >= 0);
125 assert_se(sd_radv_route_prefix_set_prefix(p
, &prefix
[0].address
, 2) >= 0);
126 assert_se(sd_radv_route_prefix_set_prefix(p
, &prefix
[0].address
, 3) >= 0);
127 assert_se(sd_radv_route_prefix_set_prefix(p
, &prefix
[0].address
, 125) >= 0);
128 assert_se(sd_radv_route_prefix_set_prefix(p
, &prefix
[0].address
, 128) >= 0);
129 ASSERT_RETURN_EXPECTED_SE(sd_radv_route_prefix_set_prefix(p
, &prefix
[0].address
, 129) < 0);
130 ASSERT_RETURN_EXPECTED_SE(sd_radv_route_prefix_set_prefix(p
, &prefix
[0].address
, 255) < 0);
132 assert_se(!sd_radv_route_prefix_unref(p
));
135 TEST(radv_pref64_prefix
) {
136 sd_radv_pref64_prefix
*p
;
138 assert_se(sd_radv_pref64_prefix_new(&p
) >= 0);
140 ASSERT_RETURN_EXPECTED_SE(sd_radv_pref64_prefix_set_prefix(NULL
, NULL
, 0, 0) < 0);
141 ASSERT_RETURN_EXPECTED_SE(sd_radv_pref64_prefix_set_prefix(p
, NULL
, 0, 0) < 0);
143 assert_se(sd_radv_pref64_prefix_set_prefix(p
, &prefix
[0].address
, 32, 300 * USEC_PER_SEC
) >= 0);
144 assert_se(sd_radv_pref64_prefix_set_prefix(p
, &prefix
[0].address
, 40, 300 * USEC_PER_SEC
) >= 0);
145 assert_se(sd_radv_pref64_prefix_set_prefix(p
, &prefix
[0].address
, 48, 300 * USEC_PER_SEC
) >= 0);
146 assert_se(sd_radv_pref64_prefix_set_prefix(p
, &prefix
[0].address
, 56, 300 * USEC_PER_SEC
) >= 0);
147 assert_se(sd_radv_pref64_prefix_set_prefix(p
, &prefix
[0].address
, 64, 300 * USEC_PER_SEC
) >= 0);
148 assert_se(sd_radv_pref64_prefix_set_prefix(p
, &prefix
[0].address
, 96, 300 * USEC_PER_SEC
) >= 0);
150 assert_se(sd_radv_pref64_prefix_set_prefix(p
, &prefix
[0].address
, 80, 300 * USEC_PER_SEC
) < 0);
151 assert_se(sd_radv_pref64_prefix_set_prefix(p
, &prefix
[0].address
, 80, USEC_PER_DAY
) < 0);
153 assert_se(!sd_radv_pref64_prefix_unref(p
));
159 assert_se(sd_radv_new(&ra
) >= 0);
162 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_ifindex(NULL
, 0) < 0);
163 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_ifindex(ra
, 0) < 0);
164 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_ifindex(ra
, -1) < 0);
165 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_ifindex(ra
, -2) < 0);
166 assert_se(sd_radv_set_ifindex(ra
, 42) >= 0);
168 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_mac(NULL
, NULL
) < 0);
169 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_mac(ra
, NULL
) >= 0);
170 assert_se(sd_radv_set_mac(ra
, &mac_addr
) >= 0);
172 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_mtu(NULL
, 0) < 0);
173 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_mtu(ra
, 0) < 0);
174 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_mtu(ra
, 1279) < 0);
175 assert_se(sd_radv_set_mtu(ra
, 1280) >= 0);
176 assert_se(sd_radv_set_mtu(ra
, ~0) >= 0);
178 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_hop_limit(NULL
, 0) < 0);
179 assert_se(sd_radv_set_hop_limit(ra
, 0) >= 0);
180 assert_se(sd_radv_set_hop_limit(ra
, ~0) >= 0);
182 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_router_lifetime(NULL
, 0) < 0);
183 assert_se(sd_radv_set_router_lifetime(ra
, 0) >= 0);
184 assert_se(sd_radv_set_router_lifetime(ra
, USEC_INFINITY
) < 0);
185 assert_se(sd_radv_set_router_lifetime(ra
, USEC_PER_YEAR
) < 0);
186 assert_se(sd_radv_set_router_lifetime(ra
, 300 * USEC_PER_SEC
) >= 0);
188 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_preference(NULL
, 0) < 0);
189 assert_se(sd_radv_set_preference(ra
, SD_NDISC_PREFERENCE_LOW
) >= 0);
190 assert_se(sd_radv_set_preference(ra
, SD_NDISC_PREFERENCE_MEDIUM
) >= 0);
191 assert_se(sd_radv_set_preference(ra
, SD_NDISC_PREFERENCE_HIGH
) >= 0);
192 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_preference(ra
, ~0) < 0);
194 assert_se(sd_radv_set_preference(ra
, SD_NDISC_PREFERENCE_HIGH
) >= 0);
195 assert_se(sd_radv_set_router_lifetime(ra
, 300 * USEC_PER_SEC
) >= 0);
196 assert_se(sd_radv_set_router_lifetime(ra
, 0) < 0);
197 assert_se(sd_radv_set_preference(ra
, SD_NDISC_PREFERENCE_MEDIUM
) >= 0);
198 assert_se(sd_radv_set_router_lifetime(ra
, 0) >= 0);
200 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_managed_information(NULL
, true) < 0);
201 assert_se(sd_radv_set_managed_information(ra
, true) >= 0);
202 assert_se(sd_radv_set_managed_information(ra
, false) >= 0);
204 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_other_information(NULL
, true) < 0);
205 assert_se(sd_radv_set_other_information(ra
, true) >= 0);
206 assert_se(sd_radv_set_other_information(ra
, false) >= 0);
208 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_retransmit(NULL
, 10 * USEC_PER_MSEC
) < 0);
209 assert_se(sd_radv_set_retransmit(ra
, 10 * USEC_PER_MSEC
) >= 0);
210 assert_se(sd_radv_set_retransmit(ra
, 0) >= 0);
211 assert_se(sd_radv_set_retransmit(ra
, usec_add(UINT32_MAX
* USEC_PER_MSEC
, USEC_PER_MSEC
)) < 0);
213 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_rdnss(NULL
, 0, NULL
, 0) < 0);
214 assert_se(sd_radv_set_rdnss(ra
, 0, NULL
, 0) >= 0);
215 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_rdnss(ra
, 0, NULL
, 128) < 0);
216 assert_se(sd_radv_set_rdnss(ra
, 600 * USEC_PER_SEC
, &test_rdnss
, 0) >= 0);
217 assert_se(sd_radv_set_rdnss(ra
, 600 * USEC_PER_SEC
, &test_rdnss
, 1) >= 0);
218 assert_se(sd_radv_set_rdnss(ra
, 0, &test_rdnss
, 1) >= 0);
219 assert_se(sd_radv_set_rdnss(ra
, 0, NULL
, 0) >= 0);
221 assert_se(sd_radv_set_dnssl(ra
, 0, NULL
) >= 0);
222 assert_se(sd_radv_set_dnssl(ra
, 600 * USEC_PER_SEC
, NULL
) >= 0);
223 assert_se(sd_radv_set_dnssl(ra
, 0, (char **)test_dnssl
) >= 0);
224 assert_se(sd_radv_set_dnssl(ra
, 600 * USEC_PER_SEC
, (char **)test_dnssl
) >= 0);
226 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_home_agent_information(NULL
, true) < 0);
227 assert_se(sd_radv_set_home_agent_information(ra
, true) >= 0);
228 assert_se(sd_radv_set_home_agent_information(ra
, false) >= 0);
230 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_home_agent_preference(NULL
, 10) < 0);
231 assert_se(sd_radv_set_home_agent_preference(ra
, 10) >= 0);
232 assert_se(sd_radv_set_home_agent_preference(ra
, 0) >= 0);
234 ASSERT_RETURN_EXPECTED_SE(sd_radv_set_home_agent_lifetime(NULL
, 300 * USEC_PER_SEC
) < 0);
235 assert_se(sd_radv_set_home_agent_lifetime(ra
, 300 * USEC_PER_SEC
) >= 0);
236 assert_se(sd_radv_set_home_agent_lifetime(ra
, 0) >= 0);
237 assert_se(sd_radv_set_home_agent_lifetime(ra
, USEC_PER_DAY
) < 0);
239 ra
= sd_radv_unref(ra
);
243 static void dump_message(const uint8_t *buf
, size_t len
) {
244 assert(len
>= sizeof(struct nd_router_advert
));
246 printf("Received Router Advertisement with lifetime %i sec\n",
247 (buf
[6] << 8) + buf
[7]);
249 for (size_t i
= 0; i
< len
; i
++) {
253 printf("0x%02x", buf
[i
]);
262 static void verify_message(const uint8_t *buf
, size_t len
) {
263 static const uint8_t advertisement
[] = {
264 /* ICMPv6 Router Advertisement, no checksum */
265 0x86, 0x00, 0x00, 0x00, 0x40, 0xc0, 0x00, 0xb4,
266 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267 /* Source Link Layer Address Option */
268 0x01, 0x01, 0x78, 0x2b, 0xcb, 0xb3, 0x6d, 0x53,
269 /* Prefix Information Option */
270 0x03, 0x04, 0x40, 0xc0, 0x00, 0x00, 0x01, 0xf4,
271 0x00, 0x00, 0x01, 0xb8, 0x00, 0x00, 0x00, 0x00,
272 0x20, 0x01, 0x0d, 0xb8, 0xde, 0xad, 0xbe, 0xef,
273 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
274 /* Prefix Information Option */
275 0x03, 0x04, 0x40, 0xc0, 0x00, 0x00, 0x0e, 0x10,
276 0x00, 0x00, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
277 0x20, 0x01, 0x0d, 0xb8, 0x0b, 0x16, 0xd0, 0x0d,
278 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
279 /* Prefix Information Option */
280 0x03, 0x04, 0x30, 0xc0, 0x00, 0x00, 0x0e, 0x10,
281 0x00, 0x00, 0x07, 0x08, 0x00, 0x00, 0x00, 0x00,
282 0x20, 0x01, 0x0d, 0xb8, 0xc0, 0x01, 0x0d, 0xad,
283 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
284 /* Recursive DNS Server Option */
285 0x19, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
286 0x20, 0x01, 0x0d, 0xb8, 0xde, 0xad, 0xbe, 0xef,
287 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
288 /* DNS Search List Option */
289 0x1f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c,
290 0x03, 0x6c, 0x61, 0x62, 0x05, 0x69, 0x6e, 0x74,
291 0x72, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
294 /* verify only up to known options, rest is not yet implemented */
295 for (size_t i
= 0, m
= MIN(len
, sizeof(advertisement
)); i
< m
; i
++) {
297 /* on stop, many header fields are zero */
299 case 4: /* hop limit */
301 case 6 ... 7: /* router lifetime */
302 case 8 ... 11: /* reachable time */
303 case 12 ... 15: /* retrans timer */
304 assert_se(buf
[i
] == 0);
308 assert_se(buf
[i
] == advertisement
[i
]);
312 static int radv_recv(sd_event_source
*s
, int fd
, uint32_t revents
, void *userdata
) {
313 sd_radv
*ra
= ASSERT_PTR(userdata
);
314 _cleanup_free_
uint8_t *buf
= NULL
;
317 buflen
= next_datagram_size_fd(fd
);
318 assert_se(buflen
>= 0);
319 assert_se(buf
= new0(uint8_t, buflen
));
321 assert_se(read(fd
, buf
, buflen
) == buflen
);
323 dump_message(buf
, buflen
);
324 verify_message(buf
, buflen
);
327 assert_se(sd_event_exit(sd_radv_get_event(ra
), 0) >= 0);
331 assert_se(sd_radv_stop(ra
) >= 0);
337 _cleanup_(sd_event_unrefp
) sd_event
*e
= NULL
;
338 _cleanup_(sd_event_source_unrefp
) sd_event_source
*recv_router_advertisement
= NULL
;
339 _cleanup_(sd_radv_unrefp
) sd_radv
*ra
= NULL
;
341 assert_se(socketpair(AF_UNIX
, SOCK_SEQPACKET
| SOCK_CLOEXEC
| SOCK_NONBLOCK
, 0, test_fd
) >= 0);
343 assert_se(sd_event_new(&e
) >= 0);
345 assert_se(sd_radv_new(&ra
) >= 0);
348 assert_se(sd_radv_attach_event(ra
, e
, 0) >= 0);
350 assert_se(sd_radv_set_ifindex(ra
, 42) >= 0);
351 assert_se(sd_radv_set_mac(ra
, &mac_addr
) >= 0);
352 assert_se(sd_radv_set_router_lifetime(ra
, 180 * USEC_PER_SEC
) >= 0);
353 assert_se(sd_radv_set_hop_limit(ra
, 64) >= 0);
354 assert_se(sd_radv_set_managed_information(ra
, true) >= 0);
355 assert_se(sd_radv_set_other_information(ra
, true) >= 0);
356 assert_se(sd_radv_set_rdnss(ra
, 60 * USEC_PER_SEC
, &test_rdnss
, 1) >= 0);
357 assert_se(sd_radv_set_dnssl(ra
, 60 * USEC_PER_SEC
, (char **)test_dnssl
) >= 0);
359 for (unsigned i
= 0; i
< ELEMENTSOF(prefix
); i
++) {
362 printf("Test prefix %u\n", i
);
363 assert_se(sd_radv_prefix_new(&p
) >= 0);
365 assert_se(sd_radv_prefix_set_prefix(p
, &prefix
[i
].address
,
366 prefix
[i
].prefixlen
) >= 0);
367 if (prefix
[i
].valid
> 0)
368 assert_se(sd_radv_prefix_set_valid_lifetime(p
, prefix
[i
].valid
* USEC_PER_SEC
, USEC_INFINITY
) >= 0);
369 if (prefix
[i
].preferred
> 0)
370 assert_se(sd_radv_prefix_set_preferred_lifetime(p
, prefix
[i
].preferred
* USEC_PER_SEC
, USEC_INFINITY
) >= 0);
372 assert_se((sd_radv_add_prefix(ra
, p
) >= 0) == prefix
[i
].successful
);
373 /* If the previous sd_radv_add_prefix() succeeds, then also the second call should also succeed. */
374 assert_se((sd_radv_add_prefix(ra
, p
) >= 0) == prefix
[i
].successful
);
376 p
= sd_radv_prefix_unref(p
);
380 assert_se(sd_event_add_io(e
, &recv_router_advertisement
, test_fd
[0], EPOLLIN
, radv_recv
, ra
) >= 0);
381 assert_se(sd_event_source_set_io_fd_own(recv_router_advertisement
, true) >= 0);
383 assert_se(sd_event_add_time_relative(e
, NULL
, CLOCK_BOOTTIME
,
385 NULL
, INT_TO_PTR(-ETIMEDOUT
)) >= 0);
387 assert_se(sd_radv_start(ra
) >= 0);
389 assert_se(sd_event_loop(e
) >= 0);
392 DEFINE_TEST_MAIN(LOG_DEBUG
);