return log_error_errno(r, "Failed to generate predictable MAC address for %s: %m", netdev->ifname);
}
+ r = hashmap_ensure_allocated(&netdev->manager->netdevs, &string_hash_ops);
+ if (r < 0)
+ return r;
+
r = hashmap_put(netdev->manager->netdevs, netdev->ifname, netdev);
if (r < 0)
return r;
if (filename) {
label->section = TAKE_PTR(n);
+ r = hashmap_ensure_allocated(&network->address_labels_by_section, &network_config_hash_ops);
+ if (r < 0)
+ return r;
+
r = hashmap_put(network->address_labels_by_section, label->section, label);
if (r < 0)
return r;
if (filename) {
address->section = TAKE_PTR(n);
+ r = hashmap_ensure_allocated(&network->addresses_by_section, &network_config_hash_ops);
+ if (r < 0)
+ return r;
+
r = hashmap_put(network->addresses_by_section, address->section, address);
if (r < 0)
return r;
if (filename) {
fdb_entry->section = TAKE_PTR(n);
+ r = hashmap_ensure_allocated(&network->fdb_entries_by_section, &network_config_hash_ops);
+ if (r < 0)
+ return r;
+
r = hashmap_put(network->fdb_entries_by_section, fdb_entry->section, fdb_entry);
if (r < 0)
return r;
Link *manager_dhcp6_prefix_get(Manager *m, struct in6_addr *addr) {
assert_return(m, NULL);
- assert_return(m->dhcp6_prefixes, NULL);
assert_return(addr, NULL);
return hashmap_get(m->dhcp6_prefixes, addr);
return 0;
}
+static void dhcp6_prefixes_hash_func(const void *p, struct siphash *state) {
+ const struct in6_addr *addr = p;
+
+ assert(p);
+
+ siphash24_compress(addr, sizeof(*addr), state);
+}
+
+static int dhcp6_prefixes_compare_func(const void *_a, const void *_b) {
+ const struct in6_addr *a = _a, *b = _b;
+
+ return memcmp(a, b, sizeof(*a));
+}
+
+static const struct hash_ops dhcp6_prefixes_hash_ops = {
+ .hash = dhcp6_prefixes_hash_func,
+ .compare = dhcp6_prefixes_compare_func,
+};
+
int manager_dhcp6_prefix_add(Manager *m, struct in6_addr *addr, Link *link) {
- int r;
- Route *route;
_cleanup_free_ char *buf = NULL;
+ Route *route;
+ int r;
assert_return(m, -EINVAL);
- assert_return(m->dhcp6_prefixes, -ENODATA);
assert_return(addr, -EINVAL);
r = route_add(link, AF_INET6, (union in_addr_union *) addr, 64,
(void) in_addr_to_string(AF_INET6, (union in_addr_union *) addr, &buf);
log_link_debug(link, "Adding prefix route %s/64", strnull(buf));
+ r = hashmap_ensure_allocated(&m->dhcp6_prefixes, &dhcp6_prefixes_hash_ops);
+ if (r < 0)
+ return r;
+
return hashmap_put(m->dhcp6_prefixes, addr, link);
}
}
static int manager_dhcp6_prefix_remove(Manager *m, struct in6_addr *addr) {
+ _cleanup_free_ char *buf = NULL;
+ Route *route;
Link *l;
int r;
- Route *route;
- _cleanup_free_ char *buf = NULL;
assert_return(m, -EINVAL);
- assert_return(m->dhcp6_prefixes, -ENODATA);
assert_return(addr, -EINVAL);
l = hashmap_remove(m->dhcp6_prefixes, addr);
}
int manager_dhcp6_prefix_remove_all(Manager *m, Link *link) {
+ struct in6_addr *addr;
Iterator i;
Link *l;
- struct in6_addr *addr;
assert_return(m, -EINVAL);
assert_return(link, -EINVAL);
return 0;
}
-static void dhcp6_prefixes_hash_func(const void *p, struct siphash *state) {
- const struct in6_addr *addr = p;
-
- assert(p);
-
- siphash24_compress(addr, sizeof(*addr), state);
-}
-
-static int dhcp6_prefixes_compare_func(const void *_a, const void *_b) {
- const struct in6_addr *a = _a, *b = _b;
-
- return memcmp(a, b, sizeof(*a));
-}
-
-static const struct hash_ops dhcp6_prefixes_hash_ops = {
- .hash = dhcp6_prefixes_hash_func,
- .compare = dhcp6_prefixes_compare_func,
-};
-
int manager_new(Manager **ret) {
_cleanup_(manager_freep) Manager *m = NULL;
int r;
if (r < 0)
return r;
- m->netdevs = hashmap_new(&string_hash_ops);
- if (!m->netdevs)
- return -ENOMEM;
-
LIST_HEAD_INIT(m->networks);
r = sd_resolve_default(&m->resolve);
if (r < 0)
return r;
- m->dhcp6_prefixes = hashmap_new(&dhcp6_prefixes_hash_ops);
- if (!m->dhcp6_prefixes)
- return -ENOMEM;
-
m->duid.type = DUID_TYPE_EN;
(void) routing_policy_load_rules(m->state_file, &m->rules_saved);
.ipv6_accept_ra_route_table = RT_TABLE_MAIN,
};
- network->stacked_netdevs = hashmap_new(&string_hash_ops);
- if (!network->stacked_netdevs)
- return log_oom();
-
- network->addresses_by_section = hashmap_new(&network_config_hash_ops);
- if (!network->addresses_by_section)
- return log_oom();
-
- network->routes_by_section = hashmap_new(&network_config_hash_ops);
- if (!network->routes_by_section)
- return log_oom();
-
- network->fdb_entries_by_section = hashmap_new(&network_config_hash_ops);
- if (!network->fdb_entries_by_section)
- return log_oom();
-
- network->address_labels_by_section = hashmap_new(&network_config_hash_ops);
- if (!network->address_labels_by_section)
- log_oom();
-
- network->prefixes_by_section = hashmap_new(&network_config_hash_ops);
- if (!network->prefixes_by_section)
- return log_oom();
-
- network->rules_by_section = hashmap_new(&network_config_hash_ops);
- if (!network->rules_by_section)
- return log_oom();
-
network->filename = strdup(filename);
if (!network->filename)
return log_oom();
case NETDEV_KIND_IPVLAN:
case NETDEV_KIND_VXLAN:
case NETDEV_KIND_VCAN:
+ r = hashmap_ensure_allocated(&network->stacked_netdevs, &string_hash_ops);
+ if (r < 0)
+ return log_oom();
+
r = hashmap_put(network->stacked_netdevs, netdev->ifname, netdev);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, r, "Cannot add NetDev '%s' to network: %m", rvalue);
return 0;
}
+ r = hashmap_ensure_allocated(&network->stacked_netdevs, &string_hash_ops);
+ if (r < 0)
+ return log_oom();
+
r = hashmap_put(network->stacked_netdevs, netdev->ifname, netdev);
if (r < 0) {
log_syntax(unit, LOG_ERR, filename, line, r, "Cannot add VLAN '%s' to network, ignoring: %m", rvalue);
int network_config_section_new(const char *filename, unsigned line, NetworkConfigSection **s);
void network_config_section_free(NetworkConfigSection *network);
-
DEFINE_TRIVIAL_CLEANUP_FUNC(NetworkConfigSection*, network_config_section_free);
+extern const struct hash_ops network_config_hash_ops;
typedef struct Manager Manager;
if (filename) {
prefix->section = TAKE_PTR(n);
- r = hashmap_put(network->prefixes_by_section, prefix->section,
- prefix);
+ r = hashmap_ensure_allocated(&network->prefixes_by_section, &network_config_hash_ops);
+ if (r < 0)
+ return r;
+
+ r = hashmap_put(network->prefixes_by_section, prefix->section, prefix);
if (r < 0)
return r;
}
if (filename) {
route->section = TAKE_PTR(n);
+ r = hashmap_ensure_allocated(&network->routes_by_section, &network_config_hash_ops);
+ if (r < 0)
+ return r;
+
r = hashmap_put(network->routes_by_section, route->section, route);
if (r < 0)
return r;
if (filename) {
rule->section = TAKE_PTR(n);
+ r = hashmap_ensure_allocated(&network->rules_by_section, &network_config_hash_ops);
+ if (r < 0)
+ return r;
+
r = hashmap_put(network->rules_by_section, rule->section, rule);
if (r < 0)
return r;
_cleanup_(network_freep) Network *network = NULL;
assert_se(network = new0(Network, 1));
- assert_se(network->addresses_by_section = hashmap_new(NULL));
assert_se(config_parse_address("network", "filename", 1, "section", 1, "Address", 0, rvalue, network, network) == 0);
assert_se(network->n_static_addresses == n_addresses);
if (n_addresses > 0) {