X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-network.c;h=966b59b878d8f658b0cf906ff6d59e90e7d9affc;hp=a2e27e09103e10b212519f8cb4857be5a9739200;hb=b98b483bac585af754e8a22ea890db8486905d8a;hpb=84b5b79a8f7b423c5b7cad4170eb68d57fe5e26c diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index a2e27e091..966b59b87 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -62,19 +62,24 @@ static int network_load_one(Manager *manager, const char *filename) { LIST_HEAD_INIT(network->static_addresses); LIST_HEAD_INIT(network->static_routes); + LIST_HEAD_INIT(network->static_fdb_entries); - network->stacked_netdevs = hashmap_new(string_hash_func, string_compare_func); + network->stacked_netdevs = hashmap_new(&string_hash_ops); if (!network->stacked_netdevs) return log_oom(); - network->addresses_by_section = hashmap_new(NULL, NULL); + network->addresses_by_section = hashmap_new(NULL); if (!network->addresses_by_section) return log_oom(); - network->routes_by_section = hashmap_new(NULL, NULL); + network->routes_by_section = hashmap_new(NULL); if (!network->routes_by_section) return log_oom(); + network->fdb_entries_by_section = hashmap_new(NULL); + if (!network->fdb_entries_by_section) + return log_oom(); + network->filename = strdup(filename); if (!network->filename) return log_oom(); @@ -90,7 +95,15 @@ static int network_load_one(Manager *manager, const char *filename) { network->llmnr = LLMNR_SUPPORT_YES; r = config_parse(NULL, filename, file, - "Match\0Network\0Address\0Route\0DHCP\0DHCPv4\0", + "Match\0" + "Link\0" + "Network\0" + "Address\0" + "Route\0" + "DHCP\0" + "DHCPv4\0" + "Bridge\0" + "BridgeFDB\0", config_item_perf_lookup, network_network_gperf_lookup, false, false, true, network); if (r < 0) @@ -131,10 +144,8 @@ int network_load(Manager *manager) { network_free(network); r = conf_files_list_strv(&files, ".network", NULL, network_dirs); - if (r < 0) { - log_error("Failed to enumerate network files: %s", strerror(-r)); - return r; - } + if (r < 0) + return log_error_errno(r, "Failed to enumerate network files: %m"); STRV_FOREACH_BACKWARDS(f, files) { r = network_load_one(manager, *f); @@ -149,6 +160,7 @@ void network_free(Network *network) { NetDev *netdev; Route *route; Address *address; + FdbEntry *fdb_entry; Iterator i; if (!network) @@ -165,6 +177,8 @@ void network_free(Network *network) { free(network->description); free(network->dhcp_vendor_class_identifier); + free(network->mac); + strv_free(network->ntp); strv_free(network->dns); strv_free(network->domains); @@ -185,8 +199,12 @@ void network_free(Network *network) { while ((address = network->static_addresses)) address_free(address); + while ((fdb_entry = network->static_fdb_entries)) + fdb_entry_free(fdb_entry); + hashmap_free(network->addresses_by_section); hashmap_free(network->routes_by_section); + hashmap_free(network->fdb_entries_by_section); if (network->manager && network->manager->networks) LIST_REMOVE(networks, network->manager->networks, network); @@ -219,8 +237,22 @@ int network_get(Manager *manager, struct udev_device *device, udev_device_get_property_value(device, "ID_NET_DRIVER"), udev_device_get_devtype(device), ifname)) { - log_debug("%-*s: found matching network '%s'", IFNAMSIZ, ifname, - network->filename); + if (network->match_name) { + const char *attr; + uint8_t name_assign_type = NET_NAME_UNKNOWN; + + attr = udev_device_get_sysattr_value(device, "name_assign_type"); + if (attr) + (void)safe_atou8(attr, &name_assign_type); + + if (name_assign_type == NET_NAME_ENUM) + log_warning("%-*s: found matching network '%s', based on potentially unpredictable ifname", + IFNAMSIZ, ifname, network->filename); + else + log_debug("%-*s: found matching network '%s'", IFNAMSIZ, ifname, network->filename); + } else + log_debug("%-*s: found matching network '%s'", IFNAMSIZ, ifname, network->filename); + *ret = network; return 0; }