X-Git-Url: http://git.ipfire.org/?a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-address-label.c;h=32b79dd1548107c0f8fd13df148bd93e5254faff;hb=116739cfb61bfff8adb65828a2955d047ba2eb01;hp=1e868ec2dec13c45c59a342ea023077b311f476d;hpb=b667d50d3443be7fd861d319b5acd525aa15329c;p=thirdparty%2Fsystemd.git diff --git a/src/network/networkd-address-label.c b/src/network/networkd-address-label.c index 1e868ec2dec..32b79dd1548 100644 --- a/src/network/networkd-address-label.c +++ b/src/network/networkd-address-label.c @@ -1,9 +1,4 @@ /* SPDX-License-Identifier: LGPL-2.1+ */ -/*** - This file is part of systemd. - - Copyright 2017 Susant Sahani -***/ #include #include @@ -16,18 +11,6 @@ #include "parse-util.h" #include "socket-util.h" -int address_label_new(AddressLabel **ret) { - _cleanup_address_label_free_ AddressLabel *addrlabel = NULL; - - addrlabel = new0(AddressLabel, 1); - if (!addrlabel) - return -ENOMEM; - - *ret = TAKE_PTR(addrlabel); - - return 0; -} - void address_label_free(AddressLabel *label) { if (!label) return; @@ -47,48 +30,87 @@ void address_label_free(AddressLabel *label) { } static int address_label_new_static(Network *network, const char *filename, unsigned section_line, AddressLabel **ret) { - _cleanup_network_config_section_free_ NetworkConfigSection *n = NULL; - _cleanup_address_label_free_ AddressLabel *label = NULL; + _cleanup_(network_config_section_freep) NetworkConfigSection *n = NULL; + _cleanup_(address_label_freep) AddressLabel *label = NULL; int r; assert(network); assert(ret); assert(!!filename == (section_line > 0)); - r = network_config_section_new(filename, section_line, &n); - if (r < 0) - return r; + if (filename) { + r = network_config_section_new(filename, section_line, &n); + if (r < 0) + return r; - label = hashmap_get(network->address_labels_by_section, n); - if (label) { - *ret = TAKE_PTR(label); + label = hashmap_get(network->address_labels_by_section, n); + if (label) { + *ret = TAKE_PTR(label); - return 0; + return 0; + } } - r = address_label_new(&label); - if (r < 0) - return r; + label = new(AddressLabel, 1); + if (!label) + return -ENOMEM; - label->section = TAKE_PTR(n); + *label = (AddressLabel) { + .network = network, + }; - r = hashmap_put(network->address_labels_by_section, label->section, label); - if (r < 0) - return r; - - label->network = network; LIST_APPEND(labels, network->address_labels, label); network->n_address_labels++; + 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; + } + *ret = TAKE_PTR(label); return 0; } +static int address_label_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) { + int r; + + assert(rtnl); + assert(m); + assert(link); + assert(link->ifname); + assert(link->address_label_messages > 0); + + link->address_label_messages--; + + if (IN_SET(link->state, LINK_STATE_FAILED, LINK_STATE_LINGER)) + return 1; + + r = sd_netlink_message_get_errno(m); + if (r < 0 && r != -EEXIST) { + log_link_message_warning_errno(link, m, r, "Could not set address label"); + link_enter_failed(link); + return 1; + } else if (r >= 0) + (void) manager_rtnl_process_address(rtnl, m, link->manager); + + if (link->address_label_messages == 0) + log_link_debug(link, "Addresses label set"); + + return 1; +} + int address_label_configure( AddressLabel *label, Link *link, - sd_netlink_message_handler_t callback, + link_netlink_message_handler_t callback, bool update) { _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL; @@ -103,23 +125,25 @@ int address_label_configure( r = sd_rtnl_message_new_addrlabel(link->manager->rtnl, &req, RTM_NEWADDRLABEL, link->ifindex, AF_INET6); if (r < 0) - return log_error_errno(r, "Could not allocate RTM_NEWADDR message: %m"); + return log_link_error_errno(link, r, "Could not allocate RTM_NEWADDR message: %m"); r = sd_rtnl_message_addrlabel_set_prefixlen(req, label->prefixlen); if (r < 0) - return log_error_errno(r, "Could not set prefixlen: %m"); + return log_link_error_errno(link, r, "Could not set prefixlen: %m"); r = sd_netlink_message_append_u32(req, IFAL_LABEL, label->label); if (r < 0) - return log_error_errno(r, "Could not append IFAL_LABEL attribute: %m"); + return log_link_error_errno(link, r, "Could not append IFAL_LABEL attribute: %m"); r = sd_netlink_message_append_in6_addr(req, IFA_ADDRESS, &label->in_addr.in6); if (r < 0) - return log_error_errno(r, "Could not append IFA_ADDRESS attribute: %m"); + return log_link_error_errno(link, r, "Could not append IFA_ADDRESS attribute: %m"); - r = sd_netlink_call_async(link->manager->rtnl, req, callback, link, 0, NULL); + r = netlink_call_async(link->manager->rtnl, NULL, req, + callback ?: address_label_handler, + link_netlink_destroy_callback, link); if (r < 0) - return log_error_errno(r, "Could not send rtnetlink message: %m"); + return log_link_error_errno(link, r, "Could not send rtnetlink message: %m"); link_ref(link); @@ -137,7 +161,7 @@ int config_parse_address_label_prefix(const char *unit, void *data, void *userdata) { - _cleanup_address_label_free_ AddressLabel *n = NULL; + _cleanup_(address_label_free_or_set_invalidp) AddressLabel *n = NULL; Network *network = userdata; int r; @@ -174,7 +198,7 @@ int config_parse_address_label( void *data, void *userdata) { - _cleanup_address_label_free_ AddressLabel *n = NULL; + _cleanup_(address_label_free_or_set_invalidp) AddressLabel *n = NULL; Network *network = userdata; uint32_t k; int r; @@ -196,7 +220,7 @@ int config_parse_address_label( } if (k == 0xffffffffUL) { - log_syntax(unit, LOG_ERR, filename, line, r, "Adress label is invalid, ignoring: %s", rvalue); + log_syntax(unit, LOG_ERR, filename, line, r, "Address label is invalid, ignoring: %s", rvalue); return 0; }