Bug Summary

File:build-scan/../src/network/networkd-network.c
Warning:line 589, column 14
Potential leak of memory pointed to by 'p'

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-unknown-linux-gnu -analyze -disable-free -disable-llvm-verifier -discard-value-names -main-file-name networkd-network.c -analyzer-store=region -analyzer-opt-analyze-nested-blocks -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -relaxed-aliasing -menable-no-infs -menable-no-nans -menable-unsafe-fp-math -fno-signed-zeros -mreassociate -freciprocal-math -fdenormal-fp-math=preserve-sign,preserve-sign -ffp-contract=fast -fno-rounding-math -ffast-math -ffinite-math-only -mconstructor-aliases -munwind-tables -target-cpu x86-64 -tune-cpu generic -fno-split-dwarf-inlining -debugger-tuning=gdb -resource-dir /usr/lib64/clang/12.0.0 -include config.h -I src/network/libnetworkd-core.a.p -I src/network -I ../src/network -I src/basic -I ../src/basic -I src/shared -I ../src/shared -I src/systemd -I ../src/systemd -I src/journal -I ../src/journal -I src/journal-remote -I ../src/journal-remote -I src/nspawn -I ../src/nspawn -I src/resolve -I ../src/resolve -I src/timesync -I ../src/timesync -I ../src/time-wait-sync -I src/login -I ../src/login -I src/udev -I ../src/udev -I src/libudev -I ../src/libudev -I src/core -I ../src/core -I ../src/libsystemd/sd-bus -I ../src/libsystemd/sd-device -I ../src/libsystemd/sd-hwdb -I ../src/libsystemd/sd-id128 -I ../src/libsystemd/sd-netlink -I ../src/libsystemd/sd-network -I src/libsystemd-network -I ../src/libsystemd-network -I . -I .. -D _FILE_OFFSET_BITS=64 -internal-isystem /usr/local/include -internal-isystem /usr/lib64/clang/12.0.0/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -Wwrite-strings -Wno-unused-parameter -Wno-missing-field-initializers -Wno-unused-result -Wno-format-signedness -Wno-error=nonnull -std=gnu99 -fconst-strings -fdebug-compilation-dir /home/mrc0mmand/repos/@redhat-plumbers/systemd-rhel8/build-scan -ferror-limit 19 -fvisibility hidden -stack-protector 2 -fgnuc-version=4.2.1 -fcolor-diagnostics -analyzer-output=html -faddrsig -o /tmp/scan-build-2021-07-16-221226-1465241-1 -x c ../src/network/networkd-network.c
1/* SPDX-License-Identifier: LGPL-2.1+ */
2
3#include <ctype.h>
4#include <net/if.h>
5
6#include "alloc-util.h"
7#include "conf-files.h"
8#include "conf-parser.h"
9#include "dns-domain.h"
10#include "fd-util.h"
11#include "hostname-util.h"
12#include "in-addr-util.h"
13#include "network-internal.h"
14#include "networkd-manager.h"
15#include "networkd-network.h"
16#include "parse-util.h"
17#include "set.h"
18#include "stat-util.h"
19#include "string-table.h"
20#include "string-util.h"
21#include "strv.h"
22#include "util.h"
23
24static void network_config_hash_func(const void *p, struct siphash *state) {
25 const NetworkConfigSection *c = p;
26
27 siphash24_compress(c->filename, strlen(c->filename), state);
28 siphash24_compress(&c->line, sizeof(c->line), state);
29}
30
31static int network_config_compare_func(const void *a, const void *b) {
32 const NetworkConfigSection *x = a, *y = b;
33 int r;
34
35 r = strcmp(x->filename, y->filename);
36 if (r != 0)
37 return r;
38
39 return y->line - x->line;
40}
41
42const struct hash_ops network_config_hash_ops = {
43 .hash = network_config_hash_func,
44 .compare = network_config_compare_func,
45};
46
47int network_config_section_new(const char *filename, unsigned line, NetworkConfigSection **s) {
48 NetworkConfigSection *cs;
49
50 cs = malloc0(offsetof(NetworkConfigSection, filename) + strlen(filename) + 1)(calloc(1, (__builtin_offsetof(NetworkConfigSection, filename
) + strlen(filename) + 1)))
;
51 if (!cs)
52 return -ENOMEM12;
53
54 strcpy(cs->filename, filename);
55 cs->line = line;
56
57 *s = TAKE_PTR(cs)({ typeof(cs) _ptr_ = (cs); (cs) = ((void*)0); _ptr_; });
58
59 return 0;
60}
61
62void network_config_section_free(NetworkConfigSection *cs) {
63 free(cs);
64}
65
66/* Set defaults following RFC7844 */
67void network_apply_anonymize_if_set(Network *network) {
68 if (!network->dhcp_anonymize)
69 return;
70 /* RFC7844 3.7
71 SHOULD NOT send the Host Name option */
72 network->dhcp_send_hostname = false0;
73 /* RFC7844 section 3.:
74 MAY contain the Client Identifier option
75 Section 3.5:
76 clients MUST use client identifiers based solely
77 on the link-layer address */
78 /* NOTE: Using MAC, as it does not reveal extra information,
79 * and some servers might not answer if this option is not sent */
80 network->dhcp_client_identifier = DHCP_CLIENT_ID_MAC;
81 /* RFC 7844 3.10:
82 SHOULD NOT use the Vendor Class Identifier option */
83 /* NOTE: it was not initiallized to any value in network_load_one. */
84 network->dhcp_vendor_class_identifier = false0;
85 /* RFC7844 section 3.6.:
86 The client intending to protect its privacy SHOULD only request a
87 minimal number of options in the PRL and SHOULD also randomly shuffle
88 the ordering of option codes in the PRL. If this random ordering
89 cannot be implemented, the client MAY order the option codes in the
90 PRL by option code number (lowest to highest).
91 */
92 /* NOTE: dhcp_use_mtu is false by default,
93 * though it was not initiallized to any value in network_load_one.
94 * Maybe there should be another var called *send*?
95 * (to use the MTU sent by the server but to do not send
96 * the option in the PRL). */
97 network->dhcp_use_mtu = false0;
98 /* NOTE: when Anonymize=yes, the PRL route options are sent by default,
99 * but this is needed to use them. */
100 network->dhcp_use_routes = true1;
101 /* RFC7844 section 3.6.
102 * same comments as previous option */
103 network->dhcp_use_timezone = false0;
104}
105
106static int network_load_one(Manager *manager, const char *filename) {
107 _cleanup_(network_freep)__attribute__((cleanup(network_freep))) Network *network = NULL((void*)0);
108 _cleanup_fclose___attribute__((cleanup(fclosep))) FILE *file = NULL((void*)0);
109 char *d;
110 const char *dropin_dirname;
111 Route *route;
112 Address *address;
113 int r;
114
115 assert(manager)do { if ((__builtin_expect(!!(!(manager)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("manager"), "../src/network/networkd-network.c"
, 115, __PRETTY_FUNCTION__); } while (0)
;
116 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/network/networkd-network.c"
, 116, __PRETTY_FUNCTION__); } while (0)
;
117
118 file = fopen(filename, "re");
119 if (!file) {
120 if (errno(*__errno_location ()) == ENOENT2)
121 return 0;
122
123 return -errno(*__errno_location ());
124 }
125
126 if (null_or_empty_fd(fileno(file))) {
127 log_debug("Skipping empty file: %s", filename)({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD
); (log_get_max_level_realm(_realm) >= ((_level) & 0x07
)) ? log_internal_realm(((_realm) << 10 | (_level)), _e
, "../src/network/networkd-network.c", 127, __func__, "Skipping empty file: %s"
, filename) : -abs(_e); })
;
128 return 0;
129 }
130
131 network = new0(Network, 1)((Network*) calloc((1), sizeof(Network)));
132 if (!network)
133 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 133, __func__)
;
134
135 network->manager = manager;
136
137 LIST_HEAD_INIT(network->static_addresses)do { (network->static_addresses) = ((void*)0); } while (0);
138 LIST_HEAD_INIT(network->static_routes)do { (network->static_routes) = ((void*)0); } while (0);
139 LIST_HEAD_INIT(network->static_fdb_entries)do { (network->static_fdb_entries) = ((void*)0); } while (
0)
;
140 LIST_HEAD_INIT(network->ipv6_proxy_ndp_addresses)do { (network->ipv6_proxy_ndp_addresses) = ((void*)0); } while
(0)
;
141 LIST_HEAD_INIT(network->address_labels)do { (network->address_labels) = ((void*)0); } while (0);
142 LIST_HEAD_INIT(network->static_prefixes)do { (network->static_prefixes) = ((void*)0); } while (0);
143 LIST_HEAD_INIT(network->rules)do { (network->rules) = ((void*)0); } while (0);
144
145 network->stacked_netdevs = hashmap_new(&string_hash_ops)internal_hashmap_new(&string_hash_ops );
146 if (!network->stacked_netdevs)
147 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 147, __func__)
;
148
149 network->addresses_by_section = hashmap_new(&network_config_hash_ops)internal_hashmap_new(&network_config_hash_ops );
150 if (!network->addresses_by_section)
151 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 151, __func__)
;
152
153 network->routes_by_section = hashmap_new(&network_config_hash_ops)internal_hashmap_new(&network_config_hash_ops );
154 if (!network->routes_by_section)
155 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 155, __func__)
;
156
157 network->fdb_entries_by_section = hashmap_new(NULL)internal_hashmap_new(((void*)0) );
158 if (!network->fdb_entries_by_section)
159 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 159, __func__)
;
160
161 network->address_labels_by_section = hashmap_new(&network_config_hash_ops)internal_hashmap_new(&network_config_hash_ops );
162 if (!network->address_labels_by_section)
163 log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 163, __func__)
;
164
165 network->prefixes_by_section = hashmap_new(&network_config_hash_ops)internal_hashmap_new(&network_config_hash_ops );
166 if (!network->prefixes_by_section)
167 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 167, __func__)
;
168
169 network->rules_by_section = hashmap_new(&network_config_hash_ops)internal_hashmap_new(&network_config_hash_ops );
170 if (!network->rules_by_section)
171 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 171, __func__)
;
172
173 network->filename = strdup(filename);
174 if (!network->filename)
175 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 175, __func__)
;
176
177 network->name = strdup(basename(filename));
178 if (!network->name)
179 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 179, __func__)
;
180
181 d = strrchr(network->name, '.');
182 if (!d)
183 return -EINVAL22;
184
185 assert(streq(d, ".network"))do { if ((__builtin_expect(!!(!((strcmp((d),(".network")) == 0
))),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("streq(d, \".network\")"
), "../src/network/networkd-network.c", 185, __PRETTY_FUNCTION__
); } while (0)
;
186
187 *d = '\0';
188
189 network->required_for_online = true1;
190 network->dhcp = ADDRESS_FAMILY_NO;
191 network->dhcp_use_ntp = true1;
192 network->dhcp_use_dns = true1;
193 network->dhcp_use_hostname = true1;
194 network->dhcp_use_routes = true1;
195 /* NOTE: this var might be overwriten by network_apply_anonymize_if_set */
196 network->dhcp_send_hostname = true1;
197 /* To enable/disable RFC7844 Anonymity Profiles */
198 network->dhcp_anonymize = false0;
199 network->dhcp_route_metric = DHCP_ROUTE_METRIC1024;
200 /* NOTE: this var might be overwrite by network_apply_anonymize_if_set */
201 network->dhcp_client_identifier = DHCP_CLIENT_ID_DUID;
202 network->dhcp_route_table = RT_TABLE_MAIN;
203 network->dhcp_route_table_set = false0;
204 /* NOTE: the following vars were not set to any default,
205 * even if they are commented in the man?
206 * These vars might be overwriten by network_apply_anonymize_if_set */
207 network->dhcp_vendor_class_identifier = false0;
208 /* NOTE: from man: UseMTU=... Defaults to false*/
209 network->dhcp_use_mtu = false0;
210 /* NOTE: from man: UseTimezone=... Defaults to "no".*/
211 network->dhcp_use_timezone = false0;
212 network->rapid_commit = true1;
213
214 network->dhcp_server_emit_dns = true1;
215 network->dhcp_server_emit_ntp = true1;
216 network->dhcp_server_emit_router = true1;
217 network->dhcp_server_emit_timezone = true1;
218
219 network->router_emit_dns = true1;
220 network->router_emit_domains = true1;
221
222 network->use_bpdu = -1;
223 network->hairpin = -1;
224 network->fast_leave = -1;
225 network->allow_port_to_be_root = -1;
226 network->unicast_flood = -1;
227 network->priority = LINK_BRIDGE_PORT_PRIORITY_INVALID128;
228
229 network->lldp_mode = LLDP_MODE_ROUTERS_ONLY;
230
231 network->llmnr = RESOLVE_SUPPORT_YES;
232 network->mdns = RESOLVE_SUPPORT_NO;
233 network->dnssec_mode = _DNSSEC_MODE_INVALID;
234 network->dns_over_tls_mode = _DNS_OVER_TLS_MODE_INVALID;
235
236 network->link_local = ADDRESS_FAMILY_IPV6;
237
238 network->ipv6_privacy_extensions = IPV6_PRIVACY_EXTENSIONS_NO;
239 network->ipv6_accept_ra = -1;
240 network->ipv6_dad_transmits = -1;
241 network->ipv6_hop_limit = -1;
242 network->ipv6_proxy_ndp = -1;
243 network->duid.type = _DUID_TYPE_INVALID;
244 network->proxy_arp = -1;
245 network->arp = -1;
246 network->multicast = -1;
247 network->allmulticast = -1;
248 network->ipv6_accept_ra_use_dns = true1;
249 network->ipv6_accept_ra_route_table = RT_TABLE_MAIN;
250 network->ipv6_mtu = 0;
251
252 dropin_dirname = strjoina(network->name, ".network.d")({ const char *_appendees_[] = { network->name, ".network.d"
}; char *_d_, *_p_; size_t _len_ = 0; size_t _i_; for (_i_ =
0; _i_ < __extension__ (__builtin_choose_expr( !__builtin_types_compatible_p
(typeof(_appendees_), typeof(&*(_appendees_))), sizeof(_appendees_
)/sizeof((_appendees_)[0]), ((void)0))) && _appendees_
[_i_]; _i_++) _len_ += strlen(_appendees_[_i_]); _p_ = _d_ = __builtin_alloca
(_len_ + 1); for (_i_ = 0; _i_ < __extension__ (__builtin_choose_expr
( !__builtin_types_compatible_p(typeof(_appendees_), typeof(&
*(_appendees_))), sizeof(_appendees_)/sizeof((_appendees_)[0]
), ((void)0))) && _appendees_[_i_]; _i_++) _p_ = stpcpy
(_p_, _appendees_[_i_]); *_p_ = 0; _d_; })
;
253
254 r = config_parse_many(filename, network_dirs, dropin_dirname,
255 "Match\0"
256 "Link\0"
257 "Network\0"
258 "Address\0"
259 "IPv6AddressLabel\0"
260 "RoutingPolicyRule\0"
261 "Route\0"
262 "DHCP\0"
263 "DHCPv4\0" /* compat */
264 "DHCPServer\0"
265 "IPv6AcceptRA\0"
266 "IPv6NDPProxyAddress\0"
267 "Bridge\0"
268 "BridgeFDB\0"
269 "BridgeVLAN\0"
270 "IPv6PrefixDelegation\0"
271 "IPv6Prefix\0"
272 "CAN\0",
273 config_item_perf_lookup, network_network_gperf_lookup,
274 CONFIG_PARSE_WARN, network);
275 if (r < 0)
276 return r;
277
278 network_apply_anonymize_if_set(network);
279
280 /* IPMasquerade=yes implies IPForward=yes */
281 if (network->ip_masquerade)
282 network->ip_forward |= ADDRESS_FAMILY_IPV4;
283
284 LIST_PREPEND(networks, manager->networks, network)do { typeof(*(manager->networks)) **_head = &(manager->
networks), *_item = (network); do { if ((__builtin_expect(!!(
!(_item)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("_item"
), "../src/network/networkd-network.c", 284, __PRETTY_FUNCTION__
); } while (0); if ((_item->networks_next = *_head)) _item
->networks_next->networks_prev = _item; _item->networks_prev
= ((void*)0); *_head = _item; } while (0)
;
285
286 r = hashmap_ensure_allocated(&manager->networks_by_name, &string_hash_ops)internal_hashmap_ensure_allocated(&manager->networks_by_name
, &string_hash_ops )
;
287 if (r < 0)
288 return r;
289
290 r = hashmap_put(manager->networks_by_name, network->name, network);
291 if (r < 0)
292 return r;
293
294 LIST_FOREACH(routes, route, network->static_routes)for ((route) = (network->static_routes); (route); (route) =
(route)->routes_next)
{
295 if (!route->family) {
296 log_warning("Route section without Gateway field configured in %s. "({ int _level = (((4))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD
); (log_get_max_level_realm(_realm) >= ((_level) & 0x07
)) ? log_internal_realm(((_realm) << 10 | (_level)), _e
, "../src/network/networkd-network.c", 297, __func__, "Route section without Gateway field configured in %s. "
"Ignoring", filename) : -abs(_e); })
297 "Ignoring", filename)({ int _level = (((4))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD
); (log_get_max_level_realm(_realm) >= ((_level) & 0x07
)) ? log_internal_realm(((_realm) << 10 | (_level)), _e
, "../src/network/networkd-network.c", 297, __func__, "Route section without Gateway field configured in %s. "
"Ignoring", filename) : -abs(_e); })
;
298 return 0;
299 }
300 }
301
302 LIST_FOREACH(addresses, address, network->static_addresses)for ((address) = (network->static_addresses); (address); (
address) = (address)->addresses_next)
{
303 if (!address->family) {
304 log_warning("Address section without Address field configured in %s. "({ int _level = (((4))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD
); (log_get_max_level_realm(_realm) >= ((_level) & 0x07
)) ? log_internal_realm(((_realm) << 10 | (_level)), _e
, "../src/network/networkd-network.c", 305, __func__, "Address section without Address field configured in %s. "
"Ignoring", filename) : -abs(_e); })
305 "Ignoring", filename)({ int _level = (((4))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD
); (log_get_max_level_realm(_realm) >= ((_level) & 0x07
)) ? log_internal_realm(((_realm) << 10 | (_level)), _e
, "../src/network/networkd-network.c", 305, __func__, "Address section without Address field configured in %s. "
"Ignoring", filename) : -abs(_e); })
;
306 return 0;
307 }
308 }
309
310 network = NULL((void*)0);
311
312 return 0;
313}
314
315int network_load(Manager *manager) {
316 Network *network;
317 _cleanup_strv_free___attribute__((cleanup(strv_freep))) char **files = NULL((void*)0);
318 char **f;
319 int r;
320
321 assert(manager)do { if ((__builtin_expect(!!(!(manager)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("manager"), "../src/network/networkd-network.c"
, 321, __PRETTY_FUNCTION__); } while (0)
;
322
323 while ((network = manager->networks))
324 network_free(network);
325
326 r = conf_files_list_strv(&files, ".network", NULL((void*)0), 0, network_dirs);
327 if (r < 0)
328 return log_error_errno(r, "Failed to enumerate network files: %m")({ int _level = ((3)), _e = ((r)), _realm = (LOG_REALM_SYSTEMD
); (log_get_max_level_realm(_realm) >= ((_level) & 0x07
)) ? log_internal_realm(((_realm) << 10 | (_level)), _e
, "../src/network/networkd-network.c", 328, __func__, "Failed to enumerate network files: %m"
) : -abs(_e); })
;
329
330 STRV_FOREACH_BACKWARDS(f, files)for (f = ({ char **_l = files; _l ? _l + strv_length(_l) - 1U
: ((void*)0); }); (files) && ((f) >= (files)); (f
)--)
{
331 r = network_load_one(manager, *f);
332 if (r < 0)
333 return r;
334 }
335
336 return 0;
337}
338
339void network_free(Network *network) {
340 IPv6ProxyNDPAddress *ipv6_proxy_ndp_address;
341 RoutingPolicyRule *rule;
342 FdbEntry *fdb_entry;
343 AddressLabel *label;
344 Prefix *prefix;
345 Address *address;
346 NetDev *netdev;
347 Route *route;
348 Iterator i;
349
350 if (!network)
351 return;
352
353 free(network->filename);
354
355 set_free_free(network->match_mac);
356 strv_free(network->match_path);
357 strv_free(network->match_driver);
358 strv_free(network->match_type);
359 strv_free(network->match_name);
360
361 free(network->description);
362 free(network->dhcp_vendor_class_identifier);
363 strv_free(network->dhcp_user_class);
364 free(network->dhcp_hostname);
365
366 free(network->mac);
367
368 strv_free(network->ntp);
369 free(network->dns);
370 strv_free(network->search_domains);
371 strv_free(network->route_domains);
372 strv_free(network->bind_carrier);
373
374 netdev_unref(network->bridge);
375 netdev_unref(network->bond);
376 netdev_unref(network->vrf);
377
378 HASHMAP_FOREACH(netdev, network->stacked_netdevs, i)for ((i) = ((Iterator) { .idx = ((2147483647 *2U +1U) - 1), .
next_key = ((void*)0) }); hashmap_iterate((network->stacked_netdevs
), &(i), (void**)&(netdev), ((void*)0)); )
{
379 hashmap_remove(network->stacked_netdevs, netdev->ifname);
380 netdev_unref(netdev);
381 }
382 hashmap_free(network->stacked_netdevs);
383
384 while ((route = network->static_routes))
385 route_free(route);
386
387 while ((address = network->static_addresses))
388 address_free(address);
389
390 while ((fdb_entry = network->static_fdb_entries))
391 fdb_entry_free(fdb_entry);
392
393 while ((ipv6_proxy_ndp_address = network->ipv6_proxy_ndp_addresses))
394 ipv6_proxy_ndp_address_free(ipv6_proxy_ndp_address);
395
396 while ((label = network->address_labels))
397 address_label_free(label);
398
399 while ((prefix = network->static_prefixes))
400 prefix_free(prefix);
401
402 while ((rule = network->rules))
403 routing_policy_rule_free(rule);
404
405 hashmap_free(network->addresses_by_section);
406 hashmap_free(network->routes_by_section);
407 hashmap_free(network->fdb_entries_by_section);
408 hashmap_free(network->address_labels_by_section);
409 hashmap_free(network->prefixes_by_section);
410 hashmap_free(network->rules_by_section);
411
412 if (network->manager) {
413 if (network->manager->networks)
414 LIST_REMOVE(networks, network->manager->networks, network)do { typeof(*(network->manager->networks)) **_head = &
(network->manager->networks), *_item = (network); do { if
((__builtin_expect(!!(!(_item)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("_item"), "../src/network/networkd-network.c"
, 414, __PRETTY_FUNCTION__); } while (0); if (_item->networks_next
) _item->networks_next->networks_prev = _item->networks_prev
; if (_item->networks_prev) _item->networks_prev->networks_next
= _item->networks_next; else { do { if ((__builtin_expect
(!!(!(*_head == _item)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD
, ("*_head == _item"), "../src/network/networkd-network.c", 414
, __PRETTY_FUNCTION__); } while (0); *_head = _item->networks_next
; } _item->networks_next = _item->networks_prev = ((void
*)0); } while (0)
;
415
416 if (network->manager->networks_by_name)
417 hashmap_remove(network->manager->networks_by_name, network->name);
418 }
419
420 free(network->name);
421
422 condition_free_list(network->match_host);
423 condition_free_list(network->match_virt);
424 condition_free_list(network->match_kernel_cmdline);
425 condition_free_list(network->match_kernel_version);
426 condition_free_list(network->match_arch);
427
428 free(network->dhcp_server_timezone);
429 free(network->dhcp_server_dns);
430 free(network->dhcp_server_ntp);
431
432 set_free_free(network->dnssec_negative_trust_anchors);
433
434 free(network);
435}
436
437int network_get_by_name(Manager *manager, const char *name, Network **ret) {
438 Network *network;
439
440 assert(manager)do { if ((__builtin_expect(!!(!(manager)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("manager"), "../src/network/networkd-network.c"
, 440, __PRETTY_FUNCTION__); } while (0)
;
441 assert(name)do { if ((__builtin_expect(!!(!(name)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("name"), "../src/network/networkd-network.c"
, 441, __PRETTY_FUNCTION__); } while (0)
;
442 assert(ret)do { if ((__builtin_expect(!!(!(ret)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("ret"), "../src/network/networkd-network.c"
, 442, __PRETTY_FUNCTION__); } while (0)
;
443
444 network = hashmap_get(manager->networks_by_name, name);
445 if (!network)
446 return -ENOENT2;
447
448 *ret = network;
449
450 return 0;
451}
452
453int network_get(Manager *manager, struct udev_device *device,
454 const char *ifname, const struct ether_addr *address,
455 Network **ret) {
456 Network *network;
457 struct udev_device *parent;
458 const char *path = NULL((void*)0), *parent_driver = NULL((void*)0), *driver = NULL((void*)0), *devtype = NULL((void*)0);
459
460 assert(manager)do { if ((__builtin_expect(!!(!(manager)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("manager"), "../src/network/networkd-network.c"
, 460, __PRETTY_FUNCTION__); } while (0)
;
461 assert(ret)do { if ((__builtin_expect(!!(!(ret)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("ret"), "../src/network/networkd-network.c"
, 461, __PRETTY_FUNCTION__); } while (0)
;
462
463 if (device) {
464 path = udev_device_get_property_value(device, "ID_PATH");
465
466 parent = udev_device_get_parent(device);
467 if (parent)
468 parent_driver = udev_device_get_driver(parent);
469
470 driver = udev_device_get_property_value(device, "ID_NET_DRIVER");
471
472 devtype = udev_device_get_devtype(device);
473 }
474
475 LIST_FOREACH(networks, network, manager->networks)for ((network) = (manager->networks); (network); (network)
= (network)->networks_next)
{
476 if (net_match_config(network->match_mac, network->match_path,
477 network->match_driver, network->match_type,
478 network->match_name, network->match_host,
479 network->match_virt, network->match_kernel_cmdline,
480 network->match_kernel_version, network->match_arch,
481 address, path, parent_driver, driver,
482 devtype, ifname)) {
483 if (network->match_name && device) {
484 const char *attr;
485 uint8_t name_assign_type = NET_NAME_UNKNOWN0;
486
487 attr = udev_device_get_sysattr_value(device, "name_assign_type");
488 if (attr)
489 (void) safe_atou8(attr, &name_assign_type);
490
491 if (name_assign_type == NET_NAME_ENUM1)
492 log_warning("%s: found matching network '%s', based on potentially unpredictable ifname",({ int _level = (((4))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD
); (log_get_max_level_realm(_realm) >= ((_level) & 0x07
)) ? log_internal_realm(((_realm) << 10 | (_level)), _e
, "../src/network/networkd-network.c", 493, __func__, "%s: found matching network '%s', based on potentially unpredictable ifname"
, ifname, network->filename) : -abs(_e); })
493 ifname, network->filename)({ int _level = (((4))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD
); (log_get_max_level_realm(_realm) >= ((_level) & 0x07
)) ? log_internal_realm(((_realm) << 10 | (_level)), _e
, "../src/network/networkd-network.c", 493, __func__, "%s: found matching network '%s', based on potentially unpredictable ifname"
, ifname, network->filename) : -abs(_e); })
;
494 else
495 log_debug("%s: found matching network '%s'", ifname, network->filename)({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD
); (log_get_max_level_realm(_realm) >= ((_level) & 0x07
)) ? log_internal_realm(((_realm) << 10 | (_level)), _e
, "../src/network/networkd-network.c", 495, __func__, "%s: found matching network '%s'"
, ifname, network->filename) : -abs(_e); })
;
496 } else
497 log_debug("%s: found matching network '%s'", ifname, network->filename)({ int _level = (((7))), _e = ((0)), _realm = (LOG_REALM_SYSTEMD
); (log_get_max_level_realm(_realm) >= ((_level) & 0x07
)) ? log_internal_realm(((_realm) << 10 | (_level)), _e
, "../src/network/networkd-network.c", 497, __func__, "%s: found matching network '%s'"
, ifname, network->filename) : -abs(_e); })
;
498
499 *ret = network;
500 return 0;
501 }
502 }
503
504 *ret = NULL((void*)0);
505
506 return -ENOENT2;
507}
508
509int network_apply(Network *network, Link *link) {
510 int r;
511
512 assert(network)do { if ((__builtin_expect(!!(!(network)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("network"), "../src/network/networkd-network.c"
, 512, __PRETTY_FUNCTION__); } while (0)
;
513 assert(link)do { if ((__builtin_expect(!!(!(link)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("link"), "../src/network/networkd-network.c"
, 513, __PRETTY_FUNCTION__); } while (0)
;
514
515 link->network = network;
516
517 if (network->ipv4ll_route) {
518 Route *route;
519
520 r = route_new_static(network, NULL((void*)0), 0, &route);
521 if (r < 0)
522 return r;
523
524 r = inet_pton(AF_INET2, "169.254.0.0", &route->dst.in);
525 if (r == 0)
526 return -EINVAL22;
527 if (r < 0)
528 return -errno(*__errno_location ());
529
530 route->family = AF_INET2;
531 route->dst_prefixlen = 16;
532 route->scope = RT_SCOPE_LINK;
533 route->priority = IPV4LL_ROUTE_METRIC2048;
534 route->protocol = RTPROT_STATIC4;
535 }
536
537 if (network->n_dns > 0 ||
538 !strv_isempty(network->ntp) ||
539 !strv_isempty(network->search_domains) ||
540 !strv_isempty(network->route_domains))
541 link_dirty(link);
542
543 return 0;
544}
545
546bool_Bool network_has_static_ipv6_addresses(Network *network) {
547 Address *address;
548
549 assert(network)do { if ((__builtin_expect(!!(!(network)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("network"), "../src/network/networkd-network.c"
, 549, __PRETTY_FUNCTION__); } while (0)
;
550
551 LIST_FOREACH(addresses, address, network->static_addresses)for ((address) = (network->static_addresses); (address); (
address) = (address)->addresses_next)
{
552 if (address->family == AF_INET610)
553 return true1;
554 }
555
556 return false0;
557}
558
559int config_parse_netdev(const char *unit,
560 const char *filename,
561 unsigned line,
562 const char *section,
563 unsigned section_line,
564 const char *lvalue,
565 int ltype,
566 const char *rvalue,
567 void *data,
568 void *userdata) {
569 Network *network = userdata;
570 _cleanup_free___attribute__((cleanup(freep))) char *kind_string = NULL((void*)0);
571 char *p;
572 NetDev *netdev;
573 NetDevKind kind;
574 int r;
575
576 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/network/networkd-network.c"
, 576, __PRETTY_FUNCTION__); } while (0)
;
1
Assuming 'filename' is non-null
2
Taking false branch
3
Loop condition is false. Exiting loop
577 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 577, __PRETTY_FUNCTION__); } while (0)
;
4
Assuming 'lvalue' is non-null
5
Taking false branch
6
Loop condition is false. Exiting loop
578 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 578, __PRETTY_FUNCTION__); } while (0)
;
7
Assuming 'rvalue' is non-null
8
Taking false branch
9
Loop condition is false. Exiting loop
579 assert(data)do { if ((__builtin_expect(!!(!(data)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("data"), "../src/network/networkd-network.c"
, 579, __PRETTY_FUNCTION__); } while (0)
;
10
Assuming 'data' is non-null
11
Taking false branch
12
Loop condition is false. Exiting loop
580
581 kind_string = strdup(lvalue);
13
Memory is allocated
582 if (!kind_string)
14
Assuming 'kind_string' is non-null
15
Taking false branch
583 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 583, __func__)
;
584
585 /* the keys are CamelCase versions of the kind */
586 for (p = kind_string; *p; p++)
16
Loop condition is false. Execution continues on line 589
587 *p = tolower(*p);
588
589 kind = netdev_kind_from_string(kind_string);
17
Potential leak of memory pointed to by 'p'
590 if (kind == _NETDEV_KIND_INVALID) {
591 log_syntax(unit, LOG_ERR, filename, line, 0, "Invalid NetDev kind: %s", lvalue)({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 591
, __func__, "Invalid NetDev kind: %s", lvalue) : -abs(_e); })
;
592 return 0;
593 }
594
595 r = netdev_get(network->manager, rvalue, &netdev);
596 if (r < 0) {
597 log_syntax(unit, LOG_ERR, filename, line, r, "%s could not be found, ignoring assignment: %s", lvalue, rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 597
, __func__, "%s could not be found, ignoring assignment: %s",
lvalue, rvalue) : -abs(_e); })
;
598 return 0;
599 }
600
601 if (netdev->kind != kind) {
602 log_syntax(unit, LOG_ERR, filename, line, 0, "NetDev is not a %s, ignoring assignment: %s", lvalue, rvalue)({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 602
, __func__, "NetDev is not a %s, ignoring assignment: %s", lvalue
, rvalue) : -abs(_e); })
;
603 return 0;
604 }
605
606 switch (kind) {
607 case NETDEV_KIND_BRIDGE:
608 network->bridge = netdev;
609
610 break;
611 case NETDEV_KIND_BOND:
612 network->bond = netdev;
613
614 break;
615 case NETDEV_KIND_VRF:
616 network->vrf = netdev;
617
618 break;
619 case NETDEV_KIND_VLAN:
620 case NETDEV_KIND_MACVLAN:
621 case NETDEV_KIND_MACVTAP:
622 case NETDEV_KIND_IPVLAN:
623 case NETDEV_KIND_VXLAN:
624 case NETDEV_KIND_VCAN:
625 r = hashmap_put(network->stacked_netdevs, netdev->ifname, netdev);
626 if (r < 0) {
627 log_syntax(unit, LOG_ERR, filename, line, r, "Cannot add NetDev '%s' to network: %m", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 627
, __func__, "Cannot add NetDev '%s' to network: %m", rvalue) :
-abs(_e); })
;
628 return 0;
629 }
630
631 break;
632 default:
633 assert_not_reached("Cannot parse NetDev")do { log_assert_failed_unreachable_realm(LOG_REALM_SYSTEMD, (
"Cannot parse NetDev"), "../src/network/networkd-network.c", 633
, __PRETTY_FUNCTION__); } while (0)
;
634 }
635
636 netdev_ref(netdev);
637
638 return 0;
639}
640
641int config_parse_domains(
642 const char *unit,
643 const char *filename,
644 unsigned line,
645 const char *section,
646 unsigned section_line,
647 const char *lvalue,
648 int ltype,
649 const char *rvalue,
650 void *data,
651 void *userdata) {
652
653 const char *p;
654 Network *n = data;
655 int r;
656
657 assert(n)do { if ((__builtin_expect(!!(!(n)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("n"), "../src/network/networkd-network.c"
, 657, __PRETTY_FUNCTION__); } while (0)
;
658 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 658, __PRETTY_FUNCTION__); } while (0)
;
659 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 659, __PRETTY_FUNCTION__); } while (0)
;
660
661 if (isempty(rvalue)) {
662 n->search_domains = strv_free(n->search_domains);
663 n->route_domains = strv_free(n->route_domains);
664 return 0;
665 }
666
667 p = rvalue;
668 for (;;) {
669 _cleanup_free___attribute__((cleanup(freep))) char *w = NULL((void*)0), *normalized = NULL((void*)0);
670 const char *domain;
671 bool_Bool is_route;
672
673 r = extract_first_word(&p, &w, NULL((void*)0), 0);
674 if (r < 0) {
675 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract search or route domain, ignoring: %s", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 675
, __func__, "Failed to extract search or route domain, ignoring: %s"
, rvalue) : -abs(_e); })
;
676 break;
677 }
678 if (r == 0)
679 break;
680
681 is_route = w[0] == '~';
682 domain = is_route ? w + 1 : w;
683
684 if (dns_name_is_root(domain) || streq(domain, "*")(strcmp((domain),("*")) == 0)) {
685 /* If the root domain appears as is, or the special token "*" is found, we'll consider this as
686 * routing domain, unconditionally. */
687 is_route = true1;
688 domain = "."; /* make sure we don't allow empty strings, thus write the root domain as "." */
689
690 } else {
691 r = dns_name_normalize(domain, &normalized);
692 if (r < 0) {
693 log_syntax(unit, LOG_ERR, filename, line, r, "'%s' is not a valid domain name, ignoring.", domain)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 693
, __func__, "'%s' is not a valid domain name, ignoring.", domain
) : -abs(_e); })
;
694 continue;
695 }
696
697 domain = normalized;
698
699 if (is_localhost(domain)) {
700 log_syntax(unit, LOG_ERR, filename, line, 0, "'localhost' domain names may not be configure as search or route domains, ignoring assignment: %s", domain)({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 700
, __func__, "'localhost' domain names may not be configure as search or route domains, ignoring assignment: %s"
, domain) : -abs(_e); })
;
701 continue;
702 }
703 }
704
705 if (is_route) {
706 r = strv_extend(&n->route_domains, domain);
707 if (r < 0)
708 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 708, __func__)
;
709
710 } else {
711 r = strv_extend(&n->search_domains, domain);
712 if (r < 0)
713 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 713, __func__)
;
714 }
715 }
716
717 strv_uniq(n->route_domains);
718 strv_uniq(n->search_domains);
719
720 return 0;
721}
722
723int config_parse_tunnel(const char *unit,
724 const char *filename,
725 unsigned line,
726 const char *section,
727 unsigned section_line,
728 const char *lvalue,
729 int ltype,
730 const char *rvalue,
731 void *data,
732 void *userdata) {
733 Network *network = userdata;
734 NetDev *netdev;
735 int r;
736
737 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/network/networkd-network.c"
, 737, __PRETTY_FUNCTION__); } while (0)
;
738 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 738, __PRETTY_FUNCTION__); } while (0)
;
739 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 739, __PRETTY_FUNCTION__); } while (0)
;
740 assert(data)do { if ((__builtin_expect(!!(!(data)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("data"), "../src/network/networkd-network.c"
, 740, __PRETTY_FUNCTION__); } while (0)
;
741
742 r = netdev_get(network->manager, rvalue, &netdev);
743 if (r < 0) {
744 log_syntax(unit, LOG_ERR, filename, line, r, "Tunnel is invalid, ignoring assignment: %s", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 744
, __func__, "Tunnel is invalid, ignoring assignment: %s", rvalue
) : -abs(_e); })
;
745 return 0;
746 }
747
748 if (!IN_SET(netdev->kind,({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended
[20 - sizeof((int[]){NETDEV_KIND_IPIP, NETDEV_KIND_SIT, NETDEV_KIND_GRE
, NETDEV_KIND_GRETAP, NETDEV_KIND_IP6GRE, NETDEV_KIND_IP6GRETAP
, NETDEV_KIND_VTI, NETDEV_KIND_VTI6, NETDEV_KIND_IP6TNL})/sizeof
(int)]; switch(netdev->kind) { case NETDEV_KIND_IPIP: case
NETDEV_KIND_SIT: case NETDEV_KIND_GRE: case NETDEV_KIND_GRETAP
: case NETDEV_KIND_IP6GRE: case NETDEV_KIND_IP6GRETAP: case NETDEV_KIND_VTI
: case NETDEV_KIND_VTI6: case NETDEV_KIND_IP6TNL: _found = 1;
break; default: break; } _found; })
749 NETDEV_KIND_IPIP,({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended
[20 - sizeof((int[]){NETDEV_KIND_IPIP, NETDEV_KIND_SIT, NETDEV_KIND_GRE
, NETDEV_KIND_GRETAP, NETDEV_KIND_IP6GRE, NETDEV_KIND_IP6GRETAP
, NETDEV_KIND_VTI, NETDEV_KIND_VTI6, NETDEV_KIND_IP6TNL})/sizeof
(int)]; switch(netdev->kind) { case NETDEV_KIND_IPIP: case
NETDEV_KIND_SIT: case NETDEV_KIND_GRE: case NETDEV_KIND_GRETAP
: case NETDEV_KIND_IP6GRE: case NETDEV_KIND_IP6GRETAP: case NETDEV_KIND_VTI
: case NETDEV_KIND_VTI6: case NETDEV_KIND_IP6TNL: _found = 1;
break; default: break; } _found; })
750 NETDEV_KIND_SIT,({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended
[20 - sizeof((int[]){NETDEV_KIND_IPIP, NETDEV_KIND_SIT, NETDEV_KIND_GRE
, NETDEV_KIND_GRETAP, NETDEV_KIND_IP6GRE, NETDEV_KIND_IP6GRETAP
, NETDEV_KIND_VTI, NETDEV_KIND_VTI6, NETDEV_KIND_IP6TNL})/sizeof
(int)]; switch(netdev->kind) { case NETDEV_KIND_IPIP: case
NETDEV_KIND_SIT: case NETDEV_KIND_GRE: case NETDEV_KIND_GRETAP
: case NETDEV_KIND_IP6GRE: case NETDEV_KIND_IP6GRETAP: case NETDEV_KIND_VTI
: case NETDEV_KIND_VTI6: case NETDEV_KIND_IP6TNL: _found = 1;
break; default: break; } _found; })
751 NETDEV_KIND_GRE,({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended
[20 - sizeof((int[]){NETDEV_KIND_IPIP, NETDEV_KIND_SIT, NETDEV_KIND_GRE
, NETDEV_KIND_GRETAP, NETDEV_KIND_IP6GRE, NETDEV_KIND_IP6GRETAP
, NETDEV_KIND_VTI, NETDEV_KIND_VTI6, NETDEV_KIND_IP6TNL})/sizeof
(int)]; switch(netdev->kind) { case NETDEV_KIND_IPIP: case
NETDEV_KIND_SIT: case NETDEV_KIND_GRE: case NETDEV_KIND_GRETAP
: case NETDEV_KIND_IP6GRE: case NETDEV_KIND_IP6GRETAP: case NETDEV_KIND_VTI
: case NETDEV_KIND_VTI6: case NETDEV_KIND_IP6TNL: _found = 1;
break; default: break; } _found; })
752 NETDEV_KIND_GRETAP,({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended
[20 - sizeof((int[]){NETDEV_KIND_IPIP, NETDEV_KIND_SIT, NETDEV_KIND_GRE
, NETDEV_KIND_GRETAP, NETDEV_KIND_IP6GRE, NETDEV_KIND_IP6GRETAP
, NETDEV_KIND_VTI, NETDEV_KIND_VTI6, NETDEV_KIND_IP6TNL})/sizeof
(int)]; switch(netdev->kind) { case NETDEV_KIND_IPIP: case
NETDEV_KIND_SIT: case NETDEV_KIND_GRE: case NETDEV_KIND_GRETAP
: case NETDEV_KIND_IP6GRE: case NETDEV_KIND_IP6GRETAP: case NETDEV_KIND_VTI
: case NETDEV_KIND_VTI6: case NETDEV_KIND_IP6TNL: _found = 1;
break; default: break; } _found; })
753 NETDEV_KIND_IP6GRE,({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended
[20 - sizeof((int[]){NETDEV_KIND_IPIP, NETDEV_KIND_SIT, NETDEV_KIND_GRE
, NETDEV_KIND_GRETAP, NETDEV_KIND_IP6GRE, NETDEV_KIND_IP6GRETAP
, NETDEV_KIND_VTI, NETDEV_KIND_VTI6, NETDEV_KIND_IP6TNL})/sizeof
(int)]; switch(netdev->kind) { case NETDEV_KIND_IPIP: case
NETDEV_KIND_SIT: case NETDEV_KIND_GRE: case NETDEV_KIND_GRETAP
: case NETDEV_KIND_IP6GRE: case NETDEV_KIND_IP6GRETAP: case NETDEV_KIND_VTI
: case NETDEV_KIND_VTI6: case NETDEV_KIND_IP6TNL: _found = 1;
break; default: break; } _found; })
754 NETDEV_KIND_IP6GRETAP,({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended
[20 - sizeof((int[]){NETDEV_KIND_IPIP, NETDEV_KIND_SIT, NETDEV_KIND_GRE
, NETDEV_KIND_GRETAP, NETDEV_KIND_IP6GRE, NETDEV_KIND_IP6GRETAP
, NETDEV_KIND_VTI, NETDEV_KIND_VTI6, NETDEV_KIND_IP6TNL})/sizeof
(int)]; switch(netdev->kind) { case NETDEV_KIND_IPIP: case
NETDEV_KIND_SIT: case NETDEV_KIND_GRE: case NETDEV_KIND_GRETAP
: case NETDEV_KIND_IP6GRE: case NETDEV_KIND_IP6GRETAP: case NETDEV_KIND_VTI
: case NETDEV_KIND_VTI6: case NETDEV_KIND_IP6TNL: _found = 1;
break; default: break; } _found; })
755 NETDEV_KIND_VTI,({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended
[20 - sizeof((int[]){NETDEV_KIND_IPIP, NETDEV_KIND_SIT, NETDEV_KIND_GRE
, NETDEV_KIND_GRETAP, NETDEV_KIND_IP6GRE, NETDEV_KIND_IP6GRETAP
, NETDEV_KIND_VTI, NETDEV_KIND_VTI6, NETDEV_KIND_IP6TNL})/sizeof
(int)]; switch(netdev->kind) { case NETDEV_KIND_IPIP: case
NETDEV_KIND_SIT: case NETDEV_KIND_GRE: case NETDEV_KIND_GRETAP
: case NETDEV_KIND_IP6GRE: case NETDEV_KIND_IP6GRETAP: case NETDEV_KIND_VTI
: case NETDEV_KIND_VTI6: case NETDEV_KIND_IP6TNL: _found = 1;
break; default: break; } _found; })
756 NETDEV_KIND_VTI6,({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended
[20 - sizeof((int[]){NETDEV_KIND_IPIP, NETDEV_KIND_SIT, NETDEV_KIND_GRE
, NETDEV_KIND_GRETAP, NETDEV_KIND_IP6GRE, NETDEV_KIND_IP6GRETAP
, NETDEV_KIND_VTI, NETDEV_KIND_VTI6, NETDEV_KIND_IP6TNL})/sizeof
(int)]; switch(netdev->kind) { case NETDEV_KIND_IPIP: case
NETDEV_KIND_SIT: case NETDEV_KIND_GRE: case NETDEV_KIND_GRETAP
: case NETDEV_KIND_IP6GRE: case NETDEV_KIND_IP6GRETAP: case NETDEV_KIND_VTI
: case NETDEV_KIND_VTI6: case NETDEV_KIND_IP6TNL: _found = 1;
break; default: break; } _found; })
757 NETDEV_KIND_IP6TNL)({ _Bool _found = 0; static __attribute__ ((unused)) char _static_assert__macros_need_to_be_extended
[20 - sizeof((int[]){NETDEV_KIND_IPIP, NETDEV_KIND_SIT, NETDEV_KIND_GRE
, NETDEV_KIND_GRETAP, NETDEV_KIND_IP6GRE, NETDEV_KIND_IP6GRETAP
, NETDEV_KIND_VTI, NETDEV_KIND_VTI6, NETDEV_KIND_IP6TNL})/sizeof
(int)]; switch(netdev->kind) { case NETDEV_KIND_IPIP: case
NETDEV_KIND_SIT: case NETDEV_KIND_GRE: case NETDEV_KIND_GRETAP
: case NETDEV_KIND_IP6GRE: case NETDEV_KIND_IP6GRETAP: case NETDEV_KIND_VTI
: case NETDEV_KIND_VTI6: case NETDEV_KIND_IP6TNL: _found = 1;
break; default: break; } _found; })
) {
758 log_syntax(unit, LOG_ERR, filename, line, 0,({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 759
, __func__, "NetDev is not a tunnel, ignoring assignment: %s"
, rvalue) : -abs(_e); })
759 "NetDev is not a tunnel, ignoring assignment: %s", rvalue)({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 759
, __func__, "NetDev is not a tunnel, ignoring assignment: %s"
, rvalue) : -abs(_e); })
;
760 return 0;
761 }
762
763 r = hashmap_put(network->stacked_netdevs, netdev->ifname, netdev);
764 if (r < 0) {
765 log_syntax(unit, LOG_ERR, filename, line, r, "Cannot add VLAN '%s' to network, ignoring: %m", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 765
, __func__, "Cannot add VLAN '%s' to network, ignoring: %m", rvalue
) : -abs(_e); })
;
766 return 0;
767 }
768
769 netdev_ref(netdev);
770
771 return 0;
772}
773
774int config_parse_ipv4ll(
775 const char* unit,
776 const char *filename,
777 unsigned line,
778 const char *section,
779 unsigned section_line,
780 const char *lvalue,
781 int ltype,
782 const char *rvalue,
783 void *data,
784 void *userdata) {
785
786 AddressFamilyBoolean *link_local = data;
787
788 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/network/networkd-network.c"
, 788, __PRETTY_FUNCTION__); } while (0)
;
789 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 789, __PRETTY_FUNCTION__); } while (0)
;
790 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 790, __PRETTY_FUNCTION__); } while (0)
;
791 assert(data)do { if ((__builtin_expect(!!(!(data)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("data"), "../src/network/networkd-network.c"
, 791, __PRETTY_FUNCTION__); } while (0)
;
792
793 /* Note that this is mostly like
794 * config_parse_address_family_boolean(), except that it
795 * applies only to IPv4 */
796
797 SET_FLAG(*link_local, ADDRESS_FAMILY_IPV4, parse_boolean(rvalue))(*link_local) = (parse_boolean(rvalue)) ? ((*link_local) | (ADDRESS_FAMILY_IPV4
)) : ((*link_local) & ~(ADDRESS_FAMILY_IPV4))
;
798
799 return 0;
800}
801
802int config_parse_dhcp(
803 const char* unit,
804 const char *filename,
805 unsigned line,
806 const char *section,
807 unsigned section_line,
808 const char *lvalue,
809 int ltype,
810 const char *rvalue,
811 void *data,
812 void *userdata) {
813
814 AddressFamilyBoolean *dhcp = data, s;
815
816 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/network/networkd-network.c"
, 816, __PRETTY_FUNCTION__); } while (0)
;
817 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 817, __PRETTY_FUNCTION__); } while (0)
;
818 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 818, __PRETTY_FUNCTION__); } while (0)
;
819 assert(data)do { if ((__builtin_expect(!!(!(data)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("data"), "../src/network/networkd-network.c"
, 819, __PRETTY_FUNCTION__); } while (0)
;
820
821 /* Note that this is mostly like
822 * config_parse_address_family_boolean(), except that it
823 * understands some old names for the enum values */
824
825 s = address_family_boolean_from_string(rvalue);
826 if (s < 0) {
827
828 /* Previously, we had a slightly different enum here,
829 * support its values for compatbility. */
830
831 if (streq(rvalue, "none")(strcmp((rvalue),("none")) == 0))
832 s = ADDRESS_FAMILY_NO;
833 else if (streq(rvalue, "v4")(strcmp((rvalue),("v4")) == 0))
834 s = ADDRESS_FAMILY_IPV4;
835 else if (streq(rvalue, "v6")(strcmp((rvalue),("v6")) == 0))
836 s = ADDRESS_FAMILY_IPV6;
837 else if (streq(rvalue, "both")(strcmp((rvalue),("both")) == 0))
838 s = ADDRESS_FAMILY_YES;
839 else {
840 log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse DHCP option, ignoring: %s", rvalue)({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 840
, __func__, "Failed to parse DHCP option, ignoring: %s", rvalue
) : -abs(_e); })
;
841 return 0;
842 }
843 }
844
845 *dhcp = s;
846 return 0;
847}
848
849static const char* const dhcp_client_identifier_table[_DHCP_CLIENT_ID_MAX] = {
850 [DHCP_CLIENT_ID_MAC] = "mac",
851 [DHCP_CLIENT_ID_DUID] = "duid",
852 [DHCP_CLIENT_ID_DUID_ONLY] = "duid-only",
853};
854
855DEFINE_PRIVATE_STRING_TABLE_LOOKUP_FROM_STRING(dhcp_client_identifier, DHCPClientIdentifier)static DHCPClientIdentifier dhcp_client_identifier_from_string
(const char *s) { return (DHCPClientIdentifier) string_table_lookup
(dhcp_client_identifier_table, __extension__ (__builtin_choose_expr
( !__builtin_types_compatible_p(typeof(dhcp_client_identifier_table
), typeof(&*(dhcp_client_identifier_table))), sizeof(dhcp_client_identifier_table
)/sizeof((dhcp_client_identifier_table)[0]), ((void)0))), s);
}
;
856DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp_client_identifier, dhcp_client_identifier, DHCPClientIdentifier, "Failed to parse client identifier type")int config_parse_dhcp_client_identifier(const char *unit, const
char *filename, unsigned line, const char *section, unsigned
section_line, const char *lvalue, int ltype, const char *rvalue
, void *data, void *userdata) { DHCPClientIdentifier *i = data
, x; do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/network/networkd-network.c"
, 856, __PRETTY_FUNCTION__); } while (0); do { if ((__builtin_expect
(!!(!(lvalue)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD
, ("lvalue"), "../src/network/networkd-network.c", 856, __PRETTY_FUNCTION__
); } while (0); do { if ((__builtin_expect(!!(!(rvalue)),0)))
log_assert_failed_realm(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 856, __PRETTY_FUNCTION__); } while (0); do { if ((__builtin_expect
(!!(!(data)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD, (
"data"), "../src/network/networkd-network.c", 856, __PRETTY_FUNCTION__
); } while (0); x = dhcp_client_identifier_from_string(rvalue
); if (x < 0) { ({ int _level = (3), _e = (0); (log_get_max_level_realm
(LOG_REALM_SYSTEMD) >= ((_level) & 0x07)) ? log_syntax_internal
(unit, _level, filename, line, _e, "../src/network/networkd-network.c"
, 856, __func__, "Failed to parse client identifier type" ", ignoring: %s"
, rvalue) : -abs(_e); }); return 0; } *i = x; return 0; }
;
857
858int config_parse_ipv6token(
859 const char* unit,
860 const char *filename,
861 unsigned line,
862 const char *section,
863 unsigned section_line,
864 const char *lvalue,
865 int ltype,
866 const char *rvalue,
867 void *data,
868 void *userdata) {
869
870 union in_addr_union buffer;
871 struct in6_addr *token = data;
872 int r;
873
874 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/network/networkd-network.c"
, 874, __PRETTY_FUNCTION__); } while (0)
;
875 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 875, __PRETTY_FUNCTION__); } while (0)
;
876 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 876, __PRETTY_FUNCTION__); } while (0)
;
877 assert(token)do { if ((__builtin_expect(!!(!(token)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("token"), "../src/network/networkd-network.c"
, 877, __PRETTY_FUNCTION__); } while (0)
;
878
879 r = in_addr_from_string(AF_INET610, rvalue, &buffer);
880 if (r < 0) {
881 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse IPv6 token, ignoring: %s", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 881
, __func__, "Failed to parse IPv6 token, ignoring: %s", rvalue
) : -abs(_e); })
;
882 return 0;
883 }
884
885 r = in_addr_is_null(AF_INET610, &buffer);
886 if (r != 0) {
887 log_syntax(unit, LOG_ERR, filename, line, r, "IPv6 token cannot be the ANY address, ignoring: %s", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 887
, __func__, "IPv6 token cannot be the ANY address, ignoring: %s"
, rvalue) : -abs(_e); })
;
888 return 0;
889 }
890
891 if ((buffer.in6.s6_addr32__in6_u.__u6_addr32[0] | buffer.in6.s6_addr32__in6_u.__u6_addr32[1]) != 0) {
892 log_syntax(unit, LOG_ERR, filename, line, 0, "IPv6 token cannot be longer than 64 bits, ignoring: %s", rvalue)({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 892
, __func__, "IPv6 token cannot be longer than 64 bits, ignoring: %s"
, rvalue) : -abs(_e); })
;
893 return 0;
894 }
895
896 *token = buffer.in6;
897
898 return 0;
899}
900
901static const char* const ipv6_privacy_extensions_table[_IPV6_PRIVACY_EXTENSIONS_MAX] = {
902 [IPV6_PRIVACY_EXTENSIONS_NO] = "no",
903 [IPV6_PRIVACY_EXTENSIONS_PREFER_PUBLIC] = "prefer-public",
904 [IPV6_PRIVACY_EXTENSIONS_YES] = "yes",
905};
906
907DEFINE_STRING_TABLE_LOOKUP(ipv6_privacy_extensions, IPv6PrivacyExtensions)const char *ipv6_privacy_extensions_to_string(IPv6PrivacyExtensions
i) { if (i < 0 || i >= (IPv6PrivacyExtensions) __extension__
(__builtin_choose_expr( !__builtin_types_compatible_p(typeof
(ipv6_privacy_extensions_table), typeof(&*(ipv6_privacy_extensions_table
))), sizeof(ipv6_privacy_extensions_table)/sizeof((ipv6_privacy_extensions_table
)[0]), ((void)0)))) return ((void*)0); return ipv6_privacy_extensions_table
[i]; } IPv6PrivacyExtensions ipv6_privacy_extensions_from_string
(const char *s) { return (IPv6PrivacyExtensions) string_table_lookup
(ipv6_privacy_extensions_table, __extension__ (__builtin_choose_expr
( !__builtin_types_compatible_p(typeof(ipv6_privacy_extensions_table
), typeof(&*(ipv6_privacy_extensions_table))), sizeof(ipv6_privacy_extensions_table
)/sizeof((ipv6_privacy_extensions_table)[0]), ((void)0))), s)
; }
;
908
909int config_parse_ipv6_privacy_extensions(
910 const char* unit,
911 const char *filename,
912 unsigned line,
913 const char *section,
914 unsigned section_line,
915 const char *lvalue,
916 int ltype,
917 const char *rvalue,
918 void *data,
919 void *userdata) {
920
921 IPv6PrivacyExtensions *ipv6_privacy_extensions = data;
922 int k;
923
924 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/network/networkd-network.c"
, 924, __PRETTY_FUNCTION__); } while (0)
;
925 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 925, __PRETTY_FUNCTION__); } while (0)
;
926 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 926, __PRETTY_FUNCTION__); } while (0)
;
927 assert(ipv6_privacy_extensions)do { if ((__builtin_expect(!!(!(ipv6_privacy_extensions)),0))
) log_assert_failed_realm(LOG_REALM_SYSTEMD, ("ipv6_privacy_extensions"
), "../src/network/networkd-network.c", 927, __PRETTY_FUNCTION__
); } while (0)
;
928
929 /* Our enum shall be a superset of booleans, hence first try
930 * to parse as boolean, and then as enum */
931
932 k = parse_boolean(rvalue);
933 if (k > 0)
934 *ipv6_privacy_extensions = IPV6_PRIVACY_EXTENSIONS_YES;
935 else if (k == 0)
936 *ipv6_privacy_extensions = IPV6_PRIVACY_EXTENSIONS_NO;
937 else {
938 IPv6PrivacyExtensions s;
939
940 s = ipv6_privacy_extensions_from_string(rvalue);
941 if (s < 0) {
942
943 if (streq(rvalue, "kernel")(strcmp((rvalue),("kernel")) == 0))
944 s = _IPV6_PRIVACY_EXTENSIONS_INVALID;
945 else {
946 log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse IPv6 privacy extensions option, ignoring: %s", rvalue)({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 946
, __func__, "Failed to parse IPv6 privacy extensions option, ignoring: %s"
, rvalue) : -abs(_e); })
;
947 return 0;
948 }
949 }
950
951 *ipv6_privacy_extensions = s;
952 }
953
954 return 0;
955}
956
957int config_parse_hostname(
958 const char *unit,
959 const char *filename,
960 unsigned line,
961 const char *section,
962 unsigned section_line,
963 const char *lvalue,
964 int ltype,
965 const char *rvalue,
966 void *data,
967 void *userdata) {
968
969 char **hostname = data, *hn = NULL((void*)0);
970 int r;
971
972 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/network/networkd-network.c"
, 972, __PRETTY_FUNCTION__); } while (0)
;
973 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 973, __PRETTY_FUNCTION__); } while (0)
;
974 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 974, __PRETTY_FUNCTION__); } while (0)
;
975
976 r = config_parse_string(unit, filename, line, section, section_line, lvalue, ltype, rvalue, &hn, userdata);
977 if (r < 0)
978 return r;
979
980 if (!hostname_is_valid(hn, false0)) {
981 log_syntax(unit, LOG_ERR, filename, line, 0, "Hostname is not valid, ignoring assignment: %s", rvalue)({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 981
, __func__, "Hostname is not valid, ignoring assignment: %s",
rvalue) : -abs(_e); })
;
982 free(hn);
983 return 0;
984 }
985
986 free(*hostname);
987 *hostname = hostname_cleanup(hn);
988 return 0;
989}
990
991int config_parse_timezone(
992 const char *unit,
993 const char *filename,
994 unsigned line,
995 const char *section,
996 unsigned section_line,
997 const char *lvalue,
998 int ltype,
999 const char *rvalue,
1000 void *data,
1001 void *userdata) {
1002
1003 char **datap = data, *tz = NULL((void*)0);
1004 int r;
1005
1006 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/network/networkd-network.c"
, 1006, __PRETTY_FUNCTION__); } while (0)
;
1007 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 1007, __PRETTY_FUNCTION__); } while (0)
;
1008 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 1008, __PRETTY_FUNCTION__); } while (0)
;
1009
1010 r = config_parse_string(unit, filename, line, section, section_line, lvalue, ltype, rvalue, &tz, userdata);
1011 if (r < 0)
1012 return r;
1013
1014 if (!timezone_is_valid(tz, LOG_ERR3)) {
1015 log_syntax(unit, LOG_ERR, filename, line, 0, "Timezone is not valid, ignoring assignment: %s", rvalue)({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1015
, __func__, "Timezone is not valid, ignoring assignment: %s",
rvalue) : -abs(_e); })
;
1016 free(tz);
1017 return 0;
1018 }
1019
1020 free(*datap);
1021 *datap = tz;
1022
1023 return 0;
1024}
1025
1026int config_parse_dhcp_server_dns(
1027 const char *unit,
1028 const char *filename,
1029 unsigned line,
1030 const char *section,
1031 unsigned section_line,
1032 const char *lvalue,
1033 int ltype,
1034 const char *rvalue,
1035 void *data,
1036 void *userdata) {
1037
1038 Network *n = data;
1039 const char *p = rvalue;
1040 int r;
1041
1042 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/network/networkd-network.c"
, 1042, __PRETTY_FUNCTION__); } while (0)
;
1043 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 1043, __PRETTY_FUNCTION__); } while (0)
;
1044 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 1044, __PRETTY_FUNCTION__); } while (0)
;
1045
1046 for (;;) {
1047 _cleanup_free___attribute__((cleanup(freep))) char *w = NULL((void*)0);
1048 struct in_addr a, *m;
1049
1050 r = extract_first_word(&p, &w, NULL((void*)0), 0);
1051 if (r == -ENOMEM12)
1052 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 1052, __func__)
;
1053 if (r < 0) {
1054 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract word, ignoring: %s", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1054
, __func__, "Failed to extract word, ignoring: %s", rvalue) :
-abs(_e); })
;
1055 return 0;
1056 }
1057 if (r == 0)
1058 break;
1059
1060 if (inet_pton(AF_INET2, w, &a) <= 0) {
1061 log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse DNS server address, ignoring: %s", w)({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1061
, __func__, "Failed to parse DNS server address, ignoring: %s"
, w) : -abs(_e); })
;
1062 continue;
1063 }
1064
1065 m = reallocarray(n->dhcp_server_dns, n->n_dhcp_server_dns + 1, sizeof(struct in_addr));
1066 if (!m)
1067 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 1067, __func__)
;
1068
1069 m[n->n_dhcp_server_dns++] = a;
1070 n->dhcp_server_dns = m;
1071 }
1072
1073 return 0;
1074}
1075
1076int config_parse_radv_dns(
1077 const char *unit,
1078 const char *filename,
1079 unsigned line,
1080 const char *section,
1081 unsigned section_line,
1082 const char *lvalue,
1083 int ltype,
1084 const char *rvalue,
1085 void *data,
1086 void *userdata) {
1087
1088 Network *n = data;
1089 const char *p = rvalue;
1090 int r;
1091
1092 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/network/networkd-network.c"
, 1092, __PRETTY_FUNCTION__); } while (0)
;
1093 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 1093, __PRETTY_FUNCTION__); } while (0)
;
1094 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 1094, __PRETTY_FUNCTION__); } while (0)
;
1095
1096 for (;;) {
1097 _cleanup_free___attribute__((cleanup(freep))) char *w = NULL((void*)0);
1098 union in_addr_union a;
1099
1100 r = extract_first_word(&p, &w, NULL((void*)0), 0);
1101 if (r == -ENOMEM12)
1102 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 1102, __func__)
;
1103 if (r < 0) {
1104 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract word, ignoring: %s", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1104
, __func__, "Failed to extract word, ignoring: %s", rvalue) :
-abs(_e); })
;
1105 return 0;
1106 }
1107 if (r == 0)
1108 break;
1109
1110 if (in_addr_from_string(AF_INET610, w, &a) >= 0) {
1111 struct in6_addr *m;
1112
1113 m = reallocarray(n->router_dns, n->n_router_dns + 1, sizeof(struct in6_addr));
1114 if (!m)
1115 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 1115, __func__)
;
1116
1117 m[n->n_router_dns++] = a.in6;
1118 n->router_dns = m;
1119
1120 } else
1121 log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse DNS server address, ignoring: %s", w)({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1121
, __func__, "Failed to parse DNS server address, ignoring: %s"
, w) : -abs(_e); })
;
1122
1123 }
1124
1125 return 0;
1126}
1127
1128int config_parse_radv_search_domains(
1129 const char *unit,
1130 const char *filename,
1131 unsigned line,
1132 const char *section,
1133 unsigned section_line,
1134 const char *lvalue,
1135 int ltype,
1136 const char *rvalue,
1137 void *data,
1138 void *userdata) {
1139
1140 Network *n = data;
1141 const char *p = rvalue;
1142 int r;
1143
1144 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/network/networkd-network.c"
, 1144, __PRETTY_FUNCTION__); } while (0)
;
1145 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 1145, __PRETTY_FUNCTION__); } while (0)
;
1146 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 1146, __PRETTY_FUNCTION__); } while (0)
;
1147
1148 for (;;) {
1149 _cleanup_free___attribute__((cleanup(freep))) char *w = NULL((void*)0);
1150 _cleanup_free___attribute__((cleanup(freep))) char *idna = NULL((void*)0);
1151
1152 r = extract_first_word(&p, &w, NULL((void*)0), 0);
1153 if (r == -ENOMEM12)
1154 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 1154, __func__)
;
1155 if (r < 0) {
1156 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract word, ignoring: %s", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1156
, __func__, "Failed to extract word, ignoring: %s", rvalue) :
-abs(_e); })
;
1157 return 0;
1158 }
1159 if (r == 0)
1160 break;
1161
1162 r = dns_name_apply_idna(w, &idna);
1163 if (r > 0) {
1164 r = strv_push(&n->router_search_domains, idna);
1165 if (r >= 0)
1166 idna = NULL((void*)0);
1167 } else if (r == 0) {
1168 r = strv_push(&n->router_search_domains, w);
1169 if (r >= 0)
1170 w = NULL((void*)0);
1171 }
1172 }
1173
1174 return 0;
1175}
1176
1177int config_parse_dhcp_server_ntp(
1178 const char *unit,
1179 const char *filename,
1180 unsigned line,
1181 const char *section,
1182 unsigned section_line,
1183 const char *lvalue,
1184 int ltype,
1185 const char *rvalue,
1186 void *data,
1187 void *userdata) {
1188
1189 Network *n = data;
1190 const char *p = rvalue;
1191 int r;
1192
1193 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/network/networkd-network.c"
, 1193, __PRETTY_FUNCTION__); } while (0)
;
1194 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 1194, __PRETTY_FUNCTION__); } while (0)
;
1195 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 1195, __PRETTY_FUNCTION__); } while (0)
;
1196
1197 for (;;) {
1198 _cleanup_free___attribute__((cleanup(freep))) char *w = NULL((void*)0);
1199 struct in_addr a, *m;
1200
1201 r = extract_first_word(&p, &w, NULL((void*)0), 0);
1202 if (r == -ENOMEM12)
1203 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 1203, __func__)
;
1204 if (r < 0) {
1205 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract word, ignoring: %s", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1205
, __func__, "Failed to extract word, ignoring: %s", rvalue) :
-abs(_e); })
;
1206 return 0;
1207 }
1208 if (r == 0)
1209 return 0;
1210
1211 if (inet_pton(AF_INET2, w, &a) <= 0) {
1212 log_syntax(unit, LOG_ERR, filename, line, 0, "Failed to parse NTP server address, ignoring: %s", w)({ int _level = (3), _e = (0); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1212
, __func__, "Failed to parse NTP server address, ignoring: %s"
, w) : -abs(_e); })
;
1213 continue;
1214 }
1215
1216 m = reallocarray(n->dhcp_server_ntp, n->n_dhcp_server_ntp + 1, sizeof(struct in_addr));
1217 if (!m)
1218 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 1218, __func__)
;
1219
1220 m[n->n_dhcp_server_ntp++] = a;
1221 n->dhcp_server_ntp = m;
1222 }
1223}
1224
1225int config_parse_dns(
1226 const char *unit,
1227 const char *filename,
1228 unsigned line,
1229 const char *section,
1230 unsigned section_line,
1231 const char *lvalue,
1232 int ltype,
1233 const char *rvalue,
1234 void *data,
1235 void *userdata) {
1236
1237 Network *n = userdata;
1238 int r;
1239
1240 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/network/networkd-network.c"
, 1240, __PRETTY_FUNCTION__); } while (0)
;
1241 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 1241, __PRETTY_FUNCTION__); } while (0)
;
1242 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 1242, __PRETTY_FUNCTION__); } while (0)
;
1243
1244 for (;;) {
1245 _cleanup_free___attribute__((cleanup(freep))) char *w = NULL((void*)0);
1246 union in_addr_union a;
1247 struct in_addr_data *m;
1248 int family;
1249
1250 r = extract_first_word(&rvalue, &w, NULL((void*)0), 0);
1251 if (r == -ENOMEM12)
1252 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 1252, __func__)
;
1253 if (r < 0) {
1254 log_syntax(unit, LOG_ERR, filename, line, r, "Invalid syntax, ignoring: %s", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1254
, __func__, "Invalid syntax, ignoring: %s", rvalue) : -abs(_e
); })
;
1255 break;
1256 }
1257 if (r == 0)
1258 break;
1259
1260 r = in_addr_from_string_auto(w, &family, &a);
1261 if (r < 0) {
1262 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to parse dns server address, ignoring: %s", w)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1262
, __func__, "Failed to parse dns server address, ignoring: %s"
, w) : -abs(_e); })
;
1263 continue;
1264 }
1265
1266 m = reallocarray(n->dns, n->n_dns + 1, sizeof(struct in_addr_data));
1267 if (!m)
1268 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 1268, __func__)
;
1269
1270 m[n->n_dns++] = (struct in_addr_data) {
1271 .family = family,
1272 .address = a,
1273 };
1274
1275 n->dns = m;
1276 }
1277
1278 return 0;
1279}
1280
1281int config_parse_dnssec_negative_trust_anchors(
1282 const char *unit,
1283 const char *filename,
1284 unsigned line,
1285 const char *section,
1286 unsigned section_line,
1287 const char *lvalue,
1288 int ltype,
1289 const char *rvalue,
1290 void *data,
1291 void *userdata) {
1292
1293 const char *p = rvalue;
1294 Network *n = data;
1295 int r;
1296
1297 assert(n)do { if ((__builtin_expect(!!(!(n)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("n"), "../src/network/networkd-network.c"
, 1297, __PRETTY_FUNCTION__); } while (0)
;
1298 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 1298, __PRETTY_FUNCTION__); } while (0)
;
1299 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 1299, __PRETTY_FUNCTION__); } while (0)
;
1300
1301 if (isempty(rvalue)) {
1302 n->dnssec_negative_trust_anchors = set_free_free(n->dnssec_negative_trust_anchors);
1303 return 0;
1304 }
1305
1306 for (;;) {
1307 _cleanup_free___attribute__((cleanup(freep))) char *w = NULL((void*)0);
1308
1309 r = extract_first_word(&p, &w, NULL((void*)0), 0);
1310 if (r < 0) {
1311 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract negative trust anchor domain, ignoring: %s", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1311
, __func__, "Failed to extract negative trust anchor domain, ignoring: %s"
, rvalue) : -abs(_e); })
;
1312 break;
1313 }
1314 if (r == 0)
1315 break;
1316
1317 r = dns_name_is_valid(w);
1318 if (r <= 0) {
1319 log_syntax(unit, LOG_ERR, filename, line, r, "%s is not a valid domain name, ignoring.", w)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1319
, __func__, "%s is not a valid domain name, ignoring.", w) : -
abs(_e); })
;
1320 continue;
1321 }
1322
1323 r = set_ensure_allocated(&n->dnssec_negative_trust_anchors, &dns_name_hash_ops)internal_set_ensure_allocated(&n->dnssec_negative_trust_anchors
, &dns_name_hash_ops )
;
1324 if (r < 0)
1325 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 1325, __func__)
;
1326
1327 r = set_put(n->dnssec_negative_trust_anchors, w);
1328 if (r < 0)
1329 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 1329, __func__)
;
1330 if (r > 0)
1331 w = NULL((void*)0);
1332 }
1333
1334 return 0;
1335}
1336
1337int config_parse_ntp(
1338 const char *unit,
1339 const char *filename,
1340 unsigned line,
1341 const char *section,
1342 unsigned section_line,
1343 const char *lvalue,
1344 int ltype,
1345 const char *rvalue,
1346 void *data,
1347 void *userdata) {
1348
1349 char ***l = data;
1350 int r;
1351
1352 assert(l)do { if ((__builtin_expect(!!(!(l)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("l"), "../src/network/networkd-network.c"
, 1352, __PRETTY_FUNCTION__); } while (0)
;
1353 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 1353, __PRETTY_FUNCTION__); } while (0)
;
1354 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 1354, __PRETTY_FUNCTION__); } while (0)
;
1355
1356 if (isempty(rvalue)) {
1357 *l = strv_free(*l);
1358 return 0;
1359 }
1360
1361 for (;;) {
1362 _cleanup_free___attribute__((cleanup(freep))) char *w = NULL((void*)0);
1363
1364 r = extract_first_word(&rvalue, &w, NULL((void*)0), 0);
1365 if (r == -ENOMEM12)
1366 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 1366, __func__)
;
1367 if (r < 0) {
1368 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to extract NTP server name, ignoring: %s", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1368
, __func__, "Failed to extract NTP server name, ignoring: %s"
, rvalue) : -abs(_e); })
;
1369 break;
1370 }
1371 if (r == 0)
1372 break;
1373
1374 r = dns_name_is_valid_or_address(w);
1375 if (r <= 0) {
1376 log_syntax(unit, LOG_ERR, filename, line, r, "%s is not a valid domain name or IP address, ignoring.", w)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1376
, __func__, "%s is not a valid domain name or IP address, ignoring."
, w) : -abs(_e); })
;
1377 continue;
1378 }
1379
1380 r = strv_push(l, w);
1381 if (r < 0)
1382 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 1382, __func__)
;
1383
1384 w = NULL((void*)0);
1385 }
1386
1387 return 0;
1388}
1389
1390int config_parse_dhcp_user_class(
1391 const char *unit,
1392 const char *filename,
1393 unsigned line,
1394 const char *section,
1395 unsigned section_line,
1396 const char *lvalue,
1397 int ltype,
1398 const char *rvalue,
1399 void *data,
1400 void *userdata) {
1401
1402 char ***l = data;
1403 int r;
1404
1405 assert(l)do { if ((__builtin_expect(!!(!(l)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("l"), "../src/network/networkd-network.c"
, 1405, __PRETTY_FUNCTION__); } while (0)
;
1406 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 1406, __PRETTY_FUNCTION__); } while (0)
;
1407 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 1407, __PRETTY_FUNCTION__); } while (0)
;
1408
1409 if (isempty(rvalue)) {
1410 *l = strv_free(*l);
1411 return 0;
1412 }
1413
1414 for (;;) {
1415 _cleanup_free___attribute__((cleanup(freep))) char *w = NULL((void*)0);
1416
1417 r = extract_first_word(&rvalue, &w, NULL((void*)0), 0);
1418 if (r == -ENOMEM12)
1419 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 1419, __func__)
;
1420 if (r < 0) {
1421 log_syntax(unit, LOG_ERR, filename, line, r, "Failed to split user classes option, ignoring: %s", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1421
, __func__, "Failed to split user classes option, ignoring: %s"
, rvalue) : -abs(_e); })
;
1422 break;
1423 }
1424 if (r == 0)
1425 break;
1426
1427 if (strlen(w) > 255) {
1428 log_syntax(unit, LOG_ERR, filename, line, r, "%s length is not in the range 1-255, ignoring.", w)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1428
, __func__, "%s length is not in the range 1-255, ignoring.",
w) : -abs(_e); })
;
1429 continue;
1430 }
1431
1432 r = strv_push(l, w);
1433 if (r < 0)
1434 return log_oom()log_oom_internal(LOG_REALM_SYSTEMD, "../src/network/networkd-network.c"
, 1434, __func__)
;
1435
1436 w = NULL((void*)0);
1437 }
1438
1439 return 0;
1440}
1441
1442int config_parse_dhcp_route_table(const char *unit,
1443 const char *filename,
1444 unsigned line,
1445 const char *section,
1446 unsigned section_line,
1447 const char *lvalue,
1448 int ltype,
1449 const char *rvalue,
1450 void *data,
1451 void *userdata) {
1452 Network *network = data;
1453 uint32_t rt;
1454 int r;
1455
1456 assert(filename)do { if ((__builtin_expect(!!(!(filename)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("filename"), "../src/network/networkd-network.c"
, 1456, __PRETTY_FUNCTION__); } while (0)
;
1457 assert(lvalue)do { if ((__builtin_expect(!!(!(lvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 1457, __PRETTY_FUNCTION__); } while (0)
;
1458 assert(rvalue)do { if ((__builtin_expect(!!(!(rvalue)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("rvalue"), "../src/network/networkd-network.c"
, 1458, __PRETTY_FUNCTION__); } while (0)
;
1459 assert(data)do { if ((__builtin_expect(!!(!(data)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("data"), "../src/network/networkd-network.c"
, 1459, __PRETTY_FUNCTION__); } while (0)
;
1460
1461 r = safe_atou32(rvalue, &rt);
1462 if (r < 0) {
1463 log_syntax(unit, LOG_ERR, filename, line, r,({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1464
, __func__, "Unable to read RouteTable, ignoring assignment: %s"
, rvalue) : -abs(_e); })
1464 "Unable to read RouteTable, ignoring assignment: %s", rvalue)({ int _level = (3), _e = (r); (log_get_max_level_realm(LOG_REALM_SYSTEMD
) >= ((_level) & 0x07)) ? log_syntax_internal(unit, _level
, filename, line, _e, "../src/network/networkd-network.c", 1464
, __func__, "Unable to read RouteTable, ignoring assignment: %s"
, rvalue) : -abs(_e); })
;
1465 return 0;
1466 }
1467
1468 network->dhcp_route_table = rt;
1469 network->dhcp_route_table_set = true1;
1470
1471 return 0;
1472}
1473
1474DEFINE_CONFIG_PARSE_ENUM(config_parse_dhcp_use_domains, dhcp_use_domains, DHCPUseDomains, "Failed to parse DHCP use domains setting")int config_parse_dhcp_use_domains(const char *unit, const char
*filename, unsigned line, const char *section, unsigned section_line
, const char *lvalue, int ltype, const char *rvalue, void *data
, void *userdata) { DHCPUseDomains *i = data, x; do { if ((__builtin_expect
(!!(!(filename)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD
, ("filename"), "../src/network/networkd-network.c", 1474, __PRETTY_FUNCTION__
); } while (0); do { if ((__builtin_expect(!!(!(lvalue)),0)))
log_assert_failed_realm(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 1474, __PRETTY_FUNCTION__); } while (0); do { if ((__builtin_expect
(!!(!(rvalue)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD
, ("rvalue"), "../src/network/networkd-network.c", 1474, __PRETTY_FUNCTION__
); } while (0); do { if ((__builtin_expect(!!(!(data)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("data"), "../src/network/networkd-network.c"
, 1474, __PRETTY_FUNCTION__); } while (0); x = dhcp_use_domains_from_string
(rvalue); if (x < 0) { ({ int _level = (3), _e = (0); (log_get_max_level_realm
(LOG_REALM_SYSTEMD) >= ((_level) & 0x07)) ? log_syntax_internal
(unit, _level, filename, line, _e, "../src/network/networkd-network.c"
, 1474, __func__, "Failed to parse DHCP use domains setting" ", ignoring: %s"
, rvalue) : -abs(_e); }); return 0; } *i = x; return 0; }
;
1475
1476static const char* const dhcp_use_domains_table[_DHCP_USE_DOMAINS_MAX] = {
1477 [DHCP_USE_DOMAINS_NO] = "no",
1478 [DHCP_USE_DOMAINS_ROUTE] = "route",
1479 [DHCP_USE_DOMAINS_YES] = "yes",
1480};
1481
1482DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(dhcp_use_domains, DHCPUseDomains, DHCP_USE_DOMAINS_YES)const char *dhcp_use_domains_to_string(DHCPUseDomains i) { if
(i < 0 || i >= (DHCPUseDomains) __extension__ (__builtin_choose_expr
( !__builtin_types_compatible_p(typeof(dhcp_use_domains_table
), typeof(&*(dhcp_use_domains_table))), sizeof(dhcp_use_domains_table
)/sizeof((dhcp_use_domains_table)[0]), ((void)0)))) return ((
void*)0); return dhcp_use_domains_table[i]; } DHCPUseDomains dhcp_use_domains_from_string
(const char *s) { int b; if (!s) return -1; b = parse_boolean
(s); if (b == 0) return (DHCPUseDomains) 0; else if (b > 0
) return DHCP_USE_DOMAINS_YES; return (DHCPUseDomains) string_table_lookup
(dhcp_use_domains_table, __extension__ (__builtin_choose_expr
( !__builtin_types_compatible_p(typeof(dhcp_use_domains_table
), typeof(&*(dhcp_use_domains_table))), sizeof(dhcp_use_domains_table
)/sizeof((dhcp_use_domains_table)[0]), ((void)0))), s); }
;
1483
1484DEFINE_CONFIG_PARSE_ENUM(config_parse_lldp_mode, lldp_mode, LLDPMode, "Failed to parse LLDP= setting.")int config_parse_lldp_mode(const char *unit, const char *filename
, unsigned line, const char *section, unsigned section_line, const
char *lvalue, int ltype, const char *rvalue, void *data, void
*userdata) { LLDPMode *i = data, x; do { if ((__builtin_expect
(!!(!(filename)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD
, ("filename"), "../src/network/networkd-network.c", 1484, __PRETTY_FUNCTION__
); } while (0); do { if ((__builtin_expect(!!(!(lvalue)),0)))
log_assert_failed_realm(LOG_REALM_SYSTEMD, ("lvalue"), "../src/network/networkd-network.c"
, 1484, __PRETTY_FUNCTION__); } while (0); do { if ((__builtin_expect
(!!(!(rvalue)),0))) log_assert_failed_realm(LOG_REALM_SYSTEMD
, ("rvalue"), "../src/network/networkd-network.c", 1484, __PRETTY_FUNCTION__
); } while (0); do { if ((__builtin_expect(!!(!(data)),0))) log_assert_failed_realm
(LOG_REALM_SYSTEMD, ("data"), "../src/network/networkd-network.c"
, 1484, __PRETTY_FUNCTION__); } while (0); x = lldp_mode_from_string
(rvalue); if (x < 0) { ({ int _level = (3), _e = (0); (log_get_max_level_realm
(LOG_REALM_SYSTEMD) >= ((_level) & 0x07)) ? log_syntax_internal
(unit, _level, filename, line, _e, "../src/network/networkd-network.c"
, 1484, __func__, "Failed to parse LLDP= setting." ", ignoring: %s"
, rvalue) : -abs(_e); }); return 0; } *i = x; return 0; }
;
1485
1486static const char* const lldp_mode_table[_LLDP_MODE_MAX] = {
1487 [LLDP_MODE_NO] = "no",
1488 [LLDP_MODE_YES] = "yes",
1489 [LLDP_MODE_ROUTERS_ONLY] = "routers-only",
1490};
1491
1492DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(lldp_mode, LLDPMode, LLDP_MODE_YES)const char *lldp_mode_to_string(LLDPMode i) { if (i < 0 ||
i >= (LLDPMode) __extension__ (__builtin_choose_expr( !__builtin_types_compatible_p
(typeof(lldp_mode_table), typeof(&*(lldp_mode_table))), sizeof
(lldp_mode_table)/sizeof((lldp_mode_table)[0]), ((void)0)))) return
((void*)0); return lldp_mode_table[i]; } LLDPMode lldp_mode_from_string
(const char *s) { int b; if (!s) return -1; b = parse_boolean
(s); if (b == 0) return (LLDPMode) 0; else if (b > 0) return
LLDP_MODE_YES; return (LLDPMode) string_table_lookup(lldp_mode_table
, __extension__ (__builtin_choose_expr( !__builtin_types_compatible_p
(typeof(lldp_mode_table), typeof(&*(lldp_mode_table))), sizeof
(lldp_mode_table)/sizeof((lldp_mode_table)[0]), ((void)0))), s
); }
;