LIST_HEAD_INIT(network->static_addresses);
LIST_HEAD_INIT(network->static_routes);
- network->vlans = hashmap_new(string_hash_func, string_compare_func);
- if (!network->vlans)
+ network->stacked_netdevs = hashmap_new(string_hash_func, string_compare_func);
+ if (!network->stacked_netdevs)
return log_oom();
- network->macvlans = hashmap_new(string_hash_func, string_compare_func);
- if (!network->macvlans)
- return log_oom();
-
- network->vxlans = hashmap_new(string_hash_func, string_compare_func);
- if (!network->vxlans)
- return log_oom();
-
- network->addresses_by_section = hashmap_new(uint64_hash_func, uint64_compare_func);
+ network->addresses_by_section = hashmap_new(NULL, NULL);
if (!network->addresses_by_section)
return log_oom();
- network->routes_by_section = hashmap_new(uint64_hash_func, uint64_compare_func);
+ network->routes_by_section = hashmap_new(NULL, NULL);
if (!network->routes_by_section)
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;
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);
netdev_unref(network->bond);
- netdev_unref(network->tunnel);
-
- HASHMAP_FOREACH(netdev, network->vlans, i)
+ HASHMAP_FOREACH(netdev, network->stacked_netdevs, i)
netdev_unref(netdev);
- hashmap_free(network->vlans);
-
- HASHMAP_FOREACH(netdev, network->macvlans, i)
- netdev_unref(netdev);
- hashmap_free(network->macvlans);
-
- HASHMAP_FOREACH(netdev, network->vxlans, i)
- netdev_unref(netdev);
- hashmap_free(network->vxlans);
+ hashmap_free(network->stacked_netdevs);
while ((route = network->static_routes))
route_free(route);
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->ifname, netdev);
- if (r < 0) {
- log_syntax(unit, LOG_ERR, filename, line, EINVAL,
- "Can not add VLAN '%s' to network: %s",
- rvalue, strerror(-r));
- return 0;
- }
-
- break;
case NETDEV_KIND_MACVLAN:
- r = hashmap_put(network->macvlans, netdev->ifname, netdev);
- if (r < 0) {
- log_syntax(unit, LOG_ERR, filename, line, EINVAL,
- "Can not add MACVLAN '%s' to network: %s",
- rvalue, strerror(-r));
- return 0;
- }
-
- break;
case NETDEV_KIND_VXLAN:
- r = hashmap_put(network->vxlans, netdev->ifname, netdev);
+ r = hashmap_put(network->stacked_netdevs, netdev->ifname, netdev);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, EINVAL,
- "Can not add VXLAN '%s' to network: %s",
+ "Can not add VLAN '%s' to network: %s",
rvalue, strerror(-r));
return 0;
}
return 0;
}
- network->tunnel = netdev;
+ r = hashmap_put(network->stacked_netdevs, netdev->ifname, netdev);
+ if (r < 0) {
+ log_syntax(unit, LOG_ERR, filename, line, EINVAL,
+ "Can not add VLAN '%s' to network: %s",
+ rvalue, strerror(-r));
+ return 0;
+ }
+
+ netdev_ref(netdev);
return 0;
}