#include <net/if.h>
#include "networkd.h"
+#include "networkd-netdev.h"
#include "network-internal.h"
#include "path-util.h"
#include "conf-files.h"
return -errno;
}
- if (null_or_empty_path(filename)) {
- log_debug("skipping empty file: %s", filename);
+ if (null_or_empty_fd(fileno(file))) {
+ log_debug("Skipping empty file: %s", filename);
return 0;
}
if (!network->vlans)
return log_oom();
- network->macvlans = hashmap_new(uint64_hash_func, uint64_compare_func);
+ network->macvlans = hashmap_new(string_hash_func, string_compare_func);
if (!network->macvlans)
return log_oom();
- network->vxlans = hashmap_new(uint64_hash_func, uint64_compare_func);
+ network->vxlans = hashmap_new(string_hash_func, string_compare_func);
if (!network->vxlans)
return log_oom();
if (!network->filename)
return log_oom();
+ network->ipv4ll_route = true;
+
network->dhcp_ntp = true;
network->dhcp_dns = true;
network->dhcp_hostname = true;
network->dhcp_routes = true;
network->dhcp_sendhost = true;
- r = config_parse(NULL, filename, file, "Match\0Network\0Address\0Route\0DHCP\0DHCPv4\0", config_item_perf_lookup,
- (void*) network_network_gperf_lookup, false, false, network);
- if (r < 0) {
- log_warning("Could not parse config file %s: %s", filename, strerror(-r));
+ r = config_parse(NULL, filename, file,
+ "Match\0Network\0Address\0Route\0DHCP\0DHCPv4\0",
+ config_item_perf_lookup, network_network_gperf_lookup,
+ false, false, true, network);
+ if (r < 0)
return r;
- }
LIST_PREPEND(networks, manager->networks, network);
free(network->match_name);
free(network->description);
+ free(network->dhcp_vendor_class_identifier);
- while ((address = network->ntp)) {
- LIST_REMOVE(addresses, network->ntp, address);
- address_free(address);
- }
-
- while ((address = network->dns)) {
- LIST_REMOVE(addresses, network->dns, address);
- address_free(address);
- }
+ strv_free(network->ntp);
+ strv_free(network->dns);
netdev_unref(network->bridge);
link->network = network;
+ if (network->ipv4ll_route) {
+ Route *route;
+
+ r = route_new_static(network, 0, &route);
+ if (r < 0)
+ return r;
+
+ r = inet_pton(AF_INET, "169.254.0.0", &route->dst_addr.in);
+ if (r == 0)
+ return -EINVAL;
+ if (r < 0)
+ return -errno;
+
+ route->family = AF_INET;
+ route->dst_prefixlen = 16;
+ route->scope = RT_SCOPE_LINK;
+ route->metrics = IPV4LL_ROUTE_METRIC;
+ route->protocol = RTPROT_STATIC;
+ }
+
if (network->dns || network->ntp) {
r = link_save(link);
if (r < 0)
break;
case NETDEV_KIND_VLAN:
- r = hashmap_put(network->vlans, &netdev->vlanid, netdev);
+ r = hashmap_put(network->vlans, netdev->ifname, netdev);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, EINVAL,
- "Can not add VLAN to network: %s", rvalue);
+ "Can not add VLAN '%s' to network: %s",
+ rvalue, strerror(-r));
return 0;
}
r = hashmap_put(network->macvlans, netdev->ifname, netdev);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, EINVAL,
- "Can not add MACVLAN to network: %s", rvalue);
+ "Can not add MACVLAN '%s' to network: %s",
+ rvalue, strerror(-r));
return 0;
}
r = hashmap_put(network->vxlans, netdev->ifname, netdev);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, EINVAL,
- "Can not add VXLAN to network: %s", rvalue);
+ "Can not add VXLAN '%s' to network: %s",
+ rvalue, strerror(-r));
return 0;
}