File: | build-scan/../src/network/networkd-network.c |
Warning: | line 589, column 14 Potential leak of memory pointed to by 'p' |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
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 | ||||
24 | static 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 | ||||
31 | static 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 | ||||
42 | const struct hash_ops network_config_hash_ops = { | |||
43 | .hash = network_config_hash_func, | |||
44 | .compare = network_config_compare_func, | |||
45 | }; | |||
46 | ||||
47 | int 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 | ||||
62 | void network_config_section_free(NetworkConfigSection *cs) { | |||
63 | free(cs); | |||
64 | } | |||
65 | ||||
66 | /* Set defaults following RFC7844 */ | |||
67 | void 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 | ||||
106 | static 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 | ||||
315 | int 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 | ||||
339 | void 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 | ||||
437 | int 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 | ||||
453 | int 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 | ||||
509 | int 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 | ||||
546 | bool_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 | ||||
559 | int 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); | |||
| ||||
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); | |||
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); | |||
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); | |||
580 | ||||
581 | kind_string = strdup(lvalue); | |||
582 | if (!kind_string) | |||
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++) | |||
587 | *p = tolower(*p); | |||
588 | ||||
589 | kind = netdev_kind_from_string(kind_string); | |||
| ||||
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 | ||||
641 | int 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 | ||||
723 | int 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 | ||||
774 | int 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 | ||||
802 | int 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 | ||||
849 | static 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 | ||||
855 | DEFINE_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); }; | |||
856 | DEFINE_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 | ||||
858 | int 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 | ||||
901 | static 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 | ||||
907 | DEFINE_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 | ||||
909 | int 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 | ||||
957 | int 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 | ||||
991 | int 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 | ||||
1026 | int 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 | ||||
1076 | int 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 | ||||
1128 | int 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 | ||||
1177 | int 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 | ||||
1225 | int 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 | ||||
1281 | int 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 | ||||
1337 | int 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 | ||||
1390 | int 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 | ||||
1442 | int 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 | ||||
1474 | DEFINE_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 | ||||
1476 | static 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 | ||||
1482 | DEFINE_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 | ||||
1484 | DEFINE_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 | ||||
1486 | static 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 | ||||
1492 | DEFINE_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 ); }; |