diff options
author | Tom Gundersen <teg@jklm.no> | 2015-09-30 14:07:12 +0200 |
---|---|---|
committer | Tom Gundersen <teg@jklm.no> | 2015-10-21 02:35:31 +0200 |
commit | fcf50cff129c1b0c6c415428e659da40c3053e6e (patch) | |
tree | 94974d85945f188d8655a55c9c13a9446e557f68 /src | |
parent | 6666907869fb3bc7fe6a6025540db5b887c7a78b (diff) |
networkd: address - rework firewall rules lifetime
Establish the firewall rule before creating the address, and do not create the address
if the firewall rule could not be created. Also, only drop the firewall rule once
the address has been removed from the kernel.
Diffstat (limited to 'src')
-rw-r--r-- | src/network/networkd-address.c | 30 |
1 files changed, 14 insertions, 16 deletions
diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index 7c74a0309d..c6de89a7f0 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -206,9 +206,9 @@ static int address_establish(Address *address, Link *link) { assert(link); masq = link->network && - link->network->ip_masquerade && - address->family == AF_INET && - address->scope < RT_SCOPE_LINK; + link->network->ip_masquerade && + address->family == AF_INET && + address->scope < RT_SCOPE_LINK; /* Add firewall entry if this is requested */ if (address->ip_masquerade_done != masq) { @@ -251,21 +251,17 @@ int address_add(Link *link, int family, const union in_addr_union *in_addr, unsi address->link = link; - r = address_establish(address, link); - if (r < 0) - return r; - *ret = address; address = NULL; return 0; } -static int address_release(Address *address, Link *link) { +static int address_release(Address *address) { int r; assert(address); - assert(link); + assert(address->link); /* Remove masquerading firewall entry if it was added */ if (address->ip_masquerade_done) { @@ -274,7 +270,7 @@ static int address_release(Address *address, Link *link) { r = fw_add_masquerade(false, AF_INET, 0, &masked, address->prefixlen, NULL, NULL, 0); if (r < 0) - log_link_warning_errno(link, r, "Failed to disable IP masquerading: %m"); + log_link_warning_errno(address->link, r, "Failed to disable IP masquerading: %m"); address->ip_masquerade_done = false; } @@ -309,7 +305,7 @@ int address_drop(Address *address) { ready = address_is_ready(address); link = address->link; - address_release(address, address->link); + address_release(address); address_free(address); if (link && !ready) @@ -350,8 +346,6 @@ int address_remove(Address *address, Link *link, assert(link->manager); assert(link->manager->rtnl); - address_release(address, link); - r = sd_rtnl_message_new_addr(link->manager->rtnl, &req, RTM_DELADDR, link->ifindex, address->family); if (r < 0) @@ -513,14 +507,18 @@ int address_configure(Address *address, Link *link, sd_netlink_message_handler_t if (r < 0) return log_error_errno(r, "Could not append IFA_CACHEINFO attribute: %m"); - r = sd_netlink_call_async(link->manager->rtnl, req, callback, link, 0, NULL); + r = address_establish(address, link); if (r < 0) + return r; + + r = sd_netlink_call_async(link->manager->rtnl, req, callback, link, 0, NULL); + if (r < 0) { + address_release(address); return log_error_errno(r, "Could not send rtnetlink message: %m"); + } link_ref(link); - address_establish(address, link); - return 0; } |