]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/libsystemd-network/radv-internal.h
Merge pull request #18990 from yuwata/network-dhcpv6-use-domains
[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 "sd-radv.h"
9
10 #include "log-link.h"
11 #include "list.h"
12 #include "sparse-endian.h"
13
14 assert_cc(SD_RADV_DEFAULT_MIN_TIMEOUT_USEC <= SD_RADV_DEFAULT_MAX_TIMEOUT_USEC);
15
16 #define SD_RADV_MAX_INITIAL_RTR_ADVERT_INTERVAL_USEC (16*USEC_PER_SEC)
17 #define SD_RADV_MAX_INITIAL_RTR_ADVERTISEMENTS 3
18 #define SD_RADV_MAX_FINAL_RTR_ADVERTISEMENTS 3
19 #define SD_RADV_MIN_DELAY_BETWEEN_RAS 3
20 #define SD_RADV_MAX_RA_DELAY_TIME_USEC (500*USEC_PER_MSEC)
21
22 #define SD_RADV_OPT_ROUTE_INFORMATION 24
23 #define SD_RADV_OPT_RDNSS 25
24 #define SD_RADV_OPT_DNSSL 31
25
26 enum RAdvState {
27 SD_RADV_STATE_IDLE = 0,
28 SD_RADV_STATE_ADVERTISING = 1,
29 };
30 typedef enum RAdvState RAdvState;
31
32 struct sd_radv_opt_dns {
33 uint8_t type;
34 uint8_t length;
35 uint16_t reserved;
36 be32_t lifetime;
37 } _packed_;
38
39 struct sd_radv {
40 unsigned n_ref;
41 RAdvState state;
42
43 int ifindex;
44 char *ifname;
45
46 sd_event *event;
47 int event_priority;
48
49 struct ether_addr mac_addr;
50 uint8_t hop_limit;
51 uint8_t flags;
52 uint32_t mtu;
53 uint16_t lifetime;
54
55 int fd;
56 unsigned ra_sent;
57 sd_event_source *recv_event_source;
58 sd_event_source *timeout_event_source;
59
60 unsigned n_prefixes;
61 LIST_HEAD(sd_radv_prefix, prefixes);
62
63 unsigned n_route_prefixes;
64 LIST_HEAD(sd_radv_route_prefix, route_prefixes);
65
66 size_t n_rdnss;
67 struct sd_radv_opt_dns *rdnss;
68 struct sd_radv_opt_dns *dnssl;
69 };
70
71 #define radv_prefix_opt__contents { \
72 uint8_t type; \
73 uint8_t length; \
74 uint8_t prefixlen; \
75 uint8_t flags; \
76 be32_t valid_lifetime; \
77 be32_t preferred_lifetime; \
78 uint32_t reserved; \
79 struct in6_addr in6_addr; \
80 }
81
82 struct radv_prefix_opt radv_prefix_opt__contents;
83
84 /* We need the opt substructure to be packed, because we use it in send(). But
85 * if we use _packed_, this means that the structure cannot be used directly in
86 * normal code in general, because the fields might not be properly aligned.
87 * But in this particular case, the structure is defined in a way that gives
88 * proper alignment, even without the explicit _packed_ attribute. To appease
89 * the compiler we use the "unpacked" structure, but we also verify that
90 * structure contains no holes, so offsets are the same when _packed_ is used.
91 */
92 struct radv_prefix_opt__packed radv_prefix_opt__contents _packed_;
93 assert_cc(sizeof(struct radv_prefix_opt) == sizeof(struct radv_prefix_opt__packed));
94
95 struct sd_radv_prefix {
96 unsigned n_ref;
97
98 struct radv_prefix_opt opt;
99
100 LIST_FIELDS(struct sd_radv_prefix, prefix);
101
102 usec_t valid_until;
103 usec_t preferred_until;
104 };
105
106 #define radv_route_prefix_opt__contents { \
107 uint8_t type; \
108 uint8_t length; \
109 uint8_t prefixlen; \
110 uint8_t flags_reserved; \
111 be32_t lifetime; \
112 struct in6_addr in6_addr; \
113 }
114
115 struct radv_route_prefix_opt radv_route_prefix_opt__contents;
116
117 struct radv_route_prefix_opt__packed radv_route_prefix_opt__contents _packed_;
118 assert_cc(sizeof(struct radv_route_prefix_opt) == sizeof(struct radv_route_prefix_opt__packed));
119
120 struct sd_radv_route_prefix {
121 unsigned n_ref;
122
123 struct radv_route_prefix_opt opt;
124
125 LIST_FIELDS(struct sd_radv_route_prefix, prefix);
126 };
127
128 #define log_radv_errno(radv, error, fmt, ...) \
129 ({ \
130 int _e = (error); \
131 if (DEBUG_LOGGING) \
132 log_interface_full_errno( \
133 sd_radv_get_ifname(radv), \
134 LOG_DEBUG, _e, "RADV: " fmt, \
135 ##__VA_ARGS__); \
136 -ERRNO_VALUE(_e); \
137 })
138 #define log_radv(radv, fmt, ...) \
139 log_radv_errno(radv, 0, fmt, ##__VA_ARGS__)