]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/network/networkd-util.c
basic: move a bunch of cmdline-related funcs to new argv-util.c+h
[thirdparty/systemd.git] / src / network / networkd-util.c
CommitLineData
db9ecf05 1/* SPDX-License-Identifier: LGPL-2.1-or-later */
fc2f9534 2
f02ba163 3#include "condition.h"
fc2f9534 4#include "conf-parser.h"
89fa9a6b 5#include "escape.h"
fd221544 6#include "networkd-link.h"
fc2f9534 7#include "networkd-util.h"
6bedfcbb 8#include "parse-util.h"
8b43440b 9#include "string-table.h"
07630cea 10#include "string-util.h"
89fa9a6b 11#include "web-util.h"
fc2f9534 12
a093533c
YW
13/* This is used in log messages, and never used in parsing settings. So, upper cases are OK. */
14static const char * const network_config_source_table[_NETWORK_CONFIG_SOURCE_MAX] = {
15 [NETWORK_CONFIG_SOURCE_FOREIGN] = "foreign",
16 [NETWORK_CONFIG_SOURCE_STATIC] = "static",
17 [NETWORK_CONFIG_SOURCE_IPV4LL] = "IPv4LL",
18 [NETWORK_CONFIG_SOURCE_DHCP4] = "DHCPv4",
19 [NETWORK_CONFIG_SOURCE_DHCP6] = "DHCPv6",
a27588d4 20 [NETWORK_CONFIG_SOURCE_DHCP_PD] = "DHCP-PD",
a093533c 21 [NETWORK_CONFIG_SOURCE_NDISC] = "NDisc",
2e62139a 22 [NETWORK_CONFIG_SOURCE_RUNTIME] = "runtime",
a093533c
YW
23};
24
25DEFINE_STRING_TABLE_LOOKUP_TO_STRING(network_config_source, NetworkConfigSource);
26
27int network_config_state_to_string_alloc(NetworkConfigState s, char **ret) {
67b65e11 28 static const char* states[] = {
67b65e11
ZJS
29 [LOG2U(NETWORK_CONFIG_STATE_REQUESTING)] = "requesting",
30 [LOG2U(NETWORK_CONFIG_STATE_CONFIGURING)] = "configuring",
31 [LOG2U(NETWORK_CONFIG_STATE_CONFIGURED)] = "configured",
32 [LOG2U(NETWORK_CONFIG_STATE_MARKED)] = "marked",
33 [LOG2U(NETWORK_CONFIG_STATE_REMOVING)] = "removing",
a093533c
YW
34 };
35 _cleanup_free_ char *buf = NULL;
36
37 assert(ret);
38
67b65e11
ZJS
39 for (size_t i = 0; i < ELEMENTSOF(states); i++)
40 if (FLAGS_SET(s, 1 << i)) {
41 assert(states[i]);
42
43 if (!strextend_with_separator(&buf, ",", states[i]))
44 return -ENOMEM;
45 }
a093533c
YW
46
47 *ret = TAKE_PTR(buf);
48 return 0;
49}
50
51static const char * const address_family_table[_ADDRESS_FAMILY_MAX] = {
135c4aad
LP
52 [ADDRESS_FAMILY_NO] = "no",
53 [ADDRESS_FAMILY_YES] = "yes",
54 [ADDRESS_FAMILY_IPV4] = "ipv4",
55 [ADDRESS_FAMILY_IPV6] = "ipv6",
e800fd24
YW
56};
57
a093533c 58static const char * const routing_policy_rule_address_family_table[_ADDRESS_FAMILY_MAX] = {
135c4aad
LP
59 [ADDRESS_FAMILY_YES] = "both",
60 [ADDRESS_FAMILY_IPV4] = "ipv4",
61 [ADDRESS_FAMILY_IPV6] = "ipv6",
f6c6ff97
YW
62};
63
a093533c 64static const char * const nexthop_address_family_table[_ADDRESS_FAMILY_MAX] = {
135c4aad
LP
65 [ADDRESS_FAMILY_IPV4] = "ipv4",
66 [ADDRESS_FAMILY_IPV6] = "ipv6",
f1923efc
YW
67};
68
a093533c 69static const char * const duplicate_address_detection_address_family_table[_ADDRESS_FAMILY_MAX] = {
135c4aad
LP
70 [ADDRESS_FAMILY_NO] = "none",
71 [ADDRESS_FAMILY_YES] = "both",
72 [ADDRESS_FAMILY_IPV4] = "ipv4",
73 [ADDRESS_FAMILY_IPV6] = "ipv6",
051e77ca
SS
74};
75
a093533c 76static const char * const dhcp_deprecated_address_family_table[_ADDRESS_FAMILY_MAX] = {
135c4aad
LP
77 [ADDRESS_FAMILY_NO] = "none",
78 [ADDRESS_FAMILY_YES] = "both",
79 [ADDRESS_FAMILY_IPV4] = "v4",
80 [ADDRESS_FAMILY_IPV6] = "v6",
bde8467a
YW
81};
82
a093533c 83static const char * const ip_masquerade_address_family_table[_ADDRESS_FAMILY_MAX] = {
4c72d851
YW
84 [ADDRESS_FAMILY_NO] = "no",
85 [ADDRESS_FAMILY_YES] = "both",
86 [ADDRESS_FAMILY_IPV4] = "ipv4",
87 [ADDRESS_FAMILY_IPV6] = "ipv6",
88};
89
a093533c 90static const char * const dhcp_lease_server_type_table[_SD_DHCP_LEASE_SERVER_TYPE_MAX] = {
ddb82ec2
LP
91 [SD_DHCP_LEASE_DNS] = "DNS servers",
92 [SD_DHCP_LEASE_NTP] = "NTP servers",
93 [SD_DHCP_LEASE_SIP] = "SIP servers",
94 [SD_DHCP_LEASE_POP3] = "POP3 servers",
95 [SD_DHCP_LEASE_SMTP] = "SMTP servers",
96 [SD_DHCP_LEASE_LPR] = "LPR servers",
ddc026f3
ZJS
97};
98
2d792895 99DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(address_family, AddressFamily, ADDRESS_FAMILY_YES);
3ca1fab7
ZJS
100
101AddressFamily link_local_address_family_from_string(const char *s) {
102 if (streq_ptr(s, "fallback")) /* compat name */
103 return ADDRESS_FAMILY_YES;
104 if (streq_ptr(s, "fallback-ipv4")) /* compat name */
105 return ADDRESS_FAMILY_IPV4;
106 return address_family_from_string(s);
107}
108
f6c6ff97 109DEFINE_STRING_TABLE_LOOKUP(routing_policy_rule_address_family, AddressFamily);
f1923efc 110DEFINE_STRING_TABLE_LOOKUP(nexthop_address_family, AddressFamily);
051e77ca 111DEFINE_STRING_TABLE_LOOKUP(duplicate_address_detection_address_family, AddressFamily);
2d792895
YW
112DEFINE_CONFIG_PARSE_ENUM(config_parse_link_local_address_family, link_local_address_family,
113 AddressFamily, "Failed to parse option");
bde8467a 114DEFINE_STRING_TABLE_LOOKUP_FROM_STRING(dhcp_deprecated_address_family, AddressFamily);
4c72d851 115DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(ip_masquerade_address_family, AddressFamily);
2324fd3a 116DEFINE_STRING_TABLE_LOOKUP(dhcp_lease_server_type, sd_dhcp_lease_server_type_t);
fc2f9534 117
2d792895 118int config_parse_address_family_with_kernel(
fc2f9534
LP
119 const char* unit,
120 const char *filename,
121 unsigned line,
122 const char *section,
123 unsigned section_line,
124 const char *lvalue,
125 int ltype,
126 const char *rvalue,
127 void *data,
128 void *userdata) {
129
2d792895 130 AddressFamily *fwd = data, s;
fc2f9534
LP
131
132 assert(filename);
133 assert(lvalue);
134 assert(rvalue);
135 assert(data);
136
765afd5c
LP
137 /* This function is mostly obsolete now. It simply redirects
138 * "kernel" to "no". In older networkd versions we used to
5238e957 139 * distinguish IPForward=off from IPForward=kernel, where the
765afd5c
LP
140 * former would explicitly turn off forwarding while the
141 * latter would simply not touch the setting. But that logic
142 * is gone, hence silently accept the old setting, but turn it
143 * to "no". */
144
2d792895 145 s = address_family_from_string(rvalue);
fc2f9534
LP
146 if (s < 0) {
147 if (streq(rvalue, "kernel"))
765afd5c 148 s = ADDRESS_FAMILY_NO;
fc2f9534 149 else {
d96edb2c 150 log_syntax(unit, LOG_WARNING, filename, line, 0, "Failed to parse IPForward= option, ignoring: %s", rvalue);
fc2f9534
LP
151 return 0;
152 }
153 }
154
155 *fwd = s;
156
157 return 0;
158}
f02ba163 159
4c72d851
YW
160int config_parse_ip_masquerade(
161 const char *unit,
162 const char *filename,
163 unsigned line,
164 const char *section,
165 unsigned section_line,
166 const char *lvalue,
167 int ltype,
168 const char *rvalue,
169 void *data,
170 void *userdata) {
171
172 AddressFamily a, *ret = data;
173 int r;
174
175 if (isempty(rvalue)) {
176 *ret = ADDRESS_FAMILY_NO;
177 return 0;
178 }
179
180 r = parse_boolean(rvalue);
181 if (r >= 0) {
182 if (r)
183 log_syntax(unit, LOG_WARNING, filename, line, 0,
184 "IPMasquerade=%s is deprecated, and it is handled as \"ipv4\" instead of \"both\". "
185 "Please use \"ipv4\" or \"both\".",
186 rvalue);
187
188 *ret = r ? ADDRESS_FAMILY_IPV4 : ADDRESS_FAMILY_NO;
189 return 0;
190 }
191
192 a = ip_masquerade_address_family_from_string(rvalue);
193 if (a < 0) {
194 log_syntax(unit, LOG_WARNING, filename, line, a,
195 "Failed to parse IPMasquerade= setting, ignoring assignment: %s", rvalue);
196 return 0;
197 }
198
199 *ret = a;
200 return 0;
201}
202
89fa9a6b
ZJS
203int config_parse_mud_url(
204 const char *unit,
205 const char *filename,
206 unsigned line,
207 const char *section,
208 unsigned section_line,
209 const char *lvalue,
210 int ltype,
211 const char *rvalue,
77976a68
YW
212 void *data,
213 void *userdata) {
214
215 _cleanup_free_ char *unescaped = NULL;
99534007 216 char **url = ASSERT_PTR(data);
77976a68 217 ssize_t l;
89fa9a6b
ZJS
218
219 assert(filename);
220 assert(lvalue);
221 assert(rvalue);
89fa9a6b 222
77976a68
YW
223 if (isempty(rvalue)) {
224 *url = mfree(*url);
225 return 0;
226 }
89fa9a6b
ZJS
227
228 l = cunescape(rvalue, 0, &unescaped);
229 if (l < 0) {
230 log_syntax(unit, LOG_WARNING, filename, line, l,
231 "Failed to unescape MUD URL, ignoring: %s", rvalue);
232 return 0;
233 }
234
235 if (l > UINT8_MAX || !http_url_is_valid(unescaped)) {
236 log_syntax(unit, LOG_WARNING, filename, line, 0,
237 "Invalid MUD URL, ignoring: %s", rvalue);
238 return 0;
239 }
240
77976a68 241 return free_and_replace(*url, unescaped);
89fa9a6b
ZJS
242}
243
fd221544
YW
244int log_link_message_full_errno(Link *link, sd_netlink_message *m, int level, int err, const char *msg) {
245 const char *err_msg = NULL;
246
247 /* link may be NULL. */
248
249 (void) sd_netlink_message_read_string(m, NLMSGERR_ATTR_MSG, &err_msg);
250 return log_link_full_errno(link, level, err,
251 "%s: %s%s%s%m",
252 msg,
253 strempty(err_msg),
254 err_msg && !endswith(err_msg, ".") ? "." : "",
255 err_msg ? " " : "");
256}