]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd-network/radv-internal.h
analyze: fix typo
[thirdparty/systemd.git] / src / libsystemd-network / radv-internal.h
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2 #pragma once
3
4 /***
5 Copyright © 2017 Intel Corporation. All rights reserved.
6 ***/
7
8 #include <netinet/in.h>
9
10 #include "forward.h"
11 #include "network-common.h"
12 #include "time-util.h"
13
14 /* RFC 4861 section 6.2.1.
15 * MaxRtrAdvInterval
16 * The maximum time allowed between sending unsolicited multicast Router Advertisements from the
17 * interface, in seconds. MUST be no less than 4 seconds and no greater than 1800 seconds.
18 * Default: 600 seconds */
19 #define RADV_MIN_MAX_TIMEOUT_USEC (4 * USEC_PER_SEC)
20 #define RADV_MAX_MAX_TIMEOUT_USEC (1800 * USEC_PER_SEC)
21 #define RADV_DEFAULT_MAX_TIMEOUT_USEC (600 * USEC_PER_SEC)
22 /* RFC 4861 section 6.2.1.
23 * MinRtrAdvInterval
24 * The minimum time allowed between sending unsolicited multicast Router Advertisements from the
25 * interface, in seconds. MUST be no less than 3 seconds and no greater than .75 * MaxRtrAdvInterval.
26 * Default: 0.33 * MaxRtrAdvInterval If MaxRtrAdvInterval >= 9 seconds; otherwise, the Default is
27 * MaxRtrAdvInterval (Note, this should be a typo. We use 0.75 * MaxRtrAdvInterval). */
28 #define RADV_MIN_MIN_TIMEOUT_USEC (3 * USEC_PER_SEC)
29 /* RFC 4861 section 6.2.4.
30 * AdvDefaultLifetime
31 * The value to be placed in the Router Lifetime field of Router Advertisements sent from the interface,
32 * in seconds. MUST be either zero or between MaxRtrAdvInterval and 9000 seconds. A value of zero
33 * indicates that the router is not to be used as a default router. These limits may be overridden by
34 * specific documents that describe how IPv6 operates over different link layers. For instance, in a
35 * point-to-point link the peers may have enough information about the number and status of devices at
36 * the other end so that advertisements are needed less frequently.
37 * Default: 3 * MaxRtrAdvInterval */
38 #define RADV_MIN_ROUTER_LIFETIME_USEC RADV_MIN_MAX_TIMEOUT_USEC
39 #define RADV_MAX_ROUTER_LIFETIME_USEC (9000 * USEC_PER_SEC)
40 #define RADV_DEFAULT_ROUTER_LIFETIME_USEC (3 * RADV_DEFAULT_MAX_TIMEOUT_USEC)
41 /* RFC 4861 section 4.2.
42 * Reachable Time and Retrans Timer
43 * 32-bit unsigned integer. The time, in milliseconds. */
44 #define RADV_MAX_UINT32_MSEC_USEC (UINT32_MAX * USEC_PER_MSEC)
45 #define RADV_MAX_REACHABLE_TIME_USEC RADV_MAX_UINT32_MSEC_USEC
46 #define RADV_MAX_RETRANSMIT_USEC RADV_MAX_UINT32_MSEC_USEC
47 /* draft-ietf-6man-slaac-renum-02 section 4.1.1.
48 * AdvPreferredLifetime: max(AdvDefaultLifetime, 3 * MaxRtrAdvInterval)
49 * AdvValidLifetime: 2 * AdvPreferredLifetime */
50 #define RADV_DEFAULT_PREFERRED_LIFETIME_USEC CONST_MAX(RADV_DEFAULT_ROUTER_LIFETIME_USEC, 3 * RADV_DEFAULT_MAX_TIMEOUT_USEC)
51 #define RADV_DEFAULT_VALID_LIFETIME_USEC (2 * RADV_DEFAULT_PREFERRED_LIFETIME_USEC)
52 /* RFC 4861 section 10.
53 * MAX_INITIAL_RTR_ADVERT_INTERVAL 16 seconds
54 * MAX_INITIAL_RTR_ADVERTISEMENTS 3 transmissions
55 * MAX_FINAL_RTR_ADVERTISEMENTS 3 transmissions
56 * MIN_DELAY_BETWEEN_RAS 3 seconds
57 * MAX_RA_DELAY_TIME .5 seconds */
58 #define RADV_MAX_INITIAL_RTR_ADVERT_INTERVAL_USEC (16 * USEC_PER_SEC)
59 #define RADV_MAX_INITIAL_RTR_ADVERTISEMENTS 3
60 #define RADV_MAX_FINAL_RTR_ADVERTISEMENTS 3
61 #define RADV_MIN_DELAY_BETWEEN_RAS 3
62 #define RADV_MAX_RA_DELAY_TIME_USEC (500 * USEC_PER_MSEC)
63 /* From RFC 8781 section 4.1
64 * By default, the value of the Scaled Lifetime field SHOULD be set to the lesser of 3 x MaxRtrAdvInterval */
65 #define RADV_PREF64_DEFAULT_LIFETIME_USEC (3 * RADV_DEFAULT_MAX_TIMEOUT_USEC)
66
67 #define RADV_RDNSS_MAX_LIFETIME_USEC (UINT32_MAX * USEC_PER_SEC)
68 #define RADV_DNSSL_MAX_LIFETIME_USEC (UINT32_MAX * USEC_PER_SEC)
69 /* rfc6275 7.4 Neighbor Discovery Home Agent Lifetime.
70 * The default value is the same as the Router Lifetime.
71 * The maximum value corresponds to 18.2 hours. 0 MUST NOT be used. */
72 #define RADV_HOME_AGENT_MAX_LIFETIME_USEC (UINT16_MAX * USEC_PER_SEC)
73
74 typedef enum RAdvState {
75 RADV_STATE_IDLE = 0,
76 RADV_STATE_ADVERTISING = 1,
77 } RAdvState;
78
79 struct sd_radv {
80 unsigned n_ref;
81 RAdvState state;
82
83 int ifindex;
84 char *ifname;
85 struct in6_addr ipv6ll;
86
87 sd_event *event;
88 int event_priority;
89
90 uint8_t hop_limit;
91 uint8_t flags;
92 uint8_t preference;
93 usec_t reachable_usec;
94 usec_t retransmit_usec;
95 usec_t lifetime_usec; /* timespan */
96
97 Set *options;
98
99 int fd;
100 unsigned ra_sent;
101 sd_event_source *recv_event_source;
102 sd_event_source *timeout_event_source;
103 };
104
105 #define log_radv_errno(radv, error, fmt, ...) \
106 log_interface_prefix_full_errno( \
107 "RADV: ", \
108 sd_radv, radv, \
109 error, fmt, ##__VA_ARGS__)
110 #define log_radv(radv, fmt, ...) \
111 log_interface_prefix_full_errno_zerook( \
112 "RADV: ", \
113 sd_radv, radv, \
114 0, fmt, ##__VA_ARGS__)