Skip to content

Commit 494b6b4

Browse files
committed
network: fix masquerade setting logic
Previously, address_establish() took Address object stored in Network object. And address_release() took Address object stored in Link object. Thus, address_release() always did nothing.
1 parent cd1caf3 commit 494b6b4

File tree

1 file changed

+36
-49
lines changed

1 file changed

+36
-49
lines changed

src/network/networkd-address.c

Lines changed: 36 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -238,29 +238,38 @@ static int address_copy(Address *dest, const Address *src) {
238238
return 0;
239239
}
240240

241-
static int address_establish(Address *address, Link *link) {
242-
bool masq;
241+
static int address_set_masquerade(Address *address, bool add) {
242+
union in_addr_union masked;
243243
int r;
244244

245245
assert(address);
246-
assert(link);
246+
assert(address->link);
247247

248-
masq = link->network &&
249-
link->network->ip_masquerade &&
250-
address->family == AF_INET &&
251-
address->scope < RT_SCOPE_LINK;
248+
if (!address->link->network)
249+
return 0;
252250

253-
/* Add firewall entry if this is requested */
254-
if (address->ip_masquerade_done != masq) {
255-
union in_addr_union masked = address->in_addr;
256-
in_addr_mask(address->family, &masked, address->prefixlen);
251+
if (!address->link->network->ip_masquerade)
252+
return 0;
257253

258-
r = fw_add_masquerade(masq, AF_INET, 0, &masked, address->prefixlen, NULL, NULL, 0);
259-
if (r < 0)
260-
return r;
254+
if (address->family != AF_INET)
255+
return 0;
261256

262-
address->ip_masquerade_done = masq;
263-
}
257+
if (address->scope >= RT_SCOPE_LINK)
258+
return 0;
259+
260+
if (address->ip_masquerade_done == add)
261+
return 0;
262+
263+
masked = address->in_addr;
264+
r = in_addr_mask(address->family, &masked, address->prefixlen);
265+
if (r < 0)
266+
return r;
267+
268+
r = fw_add_masquerade(add, AF_INET, 0, &masked, address->prefixlen, NULL, NULL, 0);
269+
if (r < 0)
270+
return r;
271+
272+
address->ip_masquerade_done = add;
264273

265274
return 0;
266275
}
@@ -334,27 +343,6 @@ static int address_add(Link *link, int family, const union in_addr_union *in_add
334343
return 0;
335344
}
336345

337-
static int address_release(Address *address) {
338-
int r;
339-
340-
assert(address);
341-
assert(address->link);
342-
343-
/* Remove masquerading firewall entry if it was added */
344-
if (address->ip_masquerade_done) {
345-
union in_addr_union masked = address->in_addr;
346-
in_addr_mask(address->family, &masked, address->prefixlen);
347-
348-
r = fw_add_masquerade(false, AF_INET, 0, &masked, address->prefixlen, NULL, NULL, 0);
349-
if (r < 0)
350-
return r;
351-
352-
address->ip_masquerade_done = false;
353-
}
354-
355-
return 0;
356-
}
357-
358346
static int address_update(
359347
Address *address,
360348
unsigned char flags,
@@ -410,7 +398,7 @@ static int address_drop(Address *address) {
410398
ready = address_is_ready(address);
411399
link = address->link;
412400

413-
r = address_release(address);
401+
r = address_set_masquerade(address, false);
414402
if (r < 0)
415403
log_link_warning_errno(link, r, "Failed to disable IP masquerading, ignoring: %m");
416404

@@ -886,27 +874,26 @@ int address_configure(
886874
if (r < 0)
887875
return log_link_error_errno(link, r, "Could not append IFA_CACHEINFO attribute: %m");
888876

889-
r = address_establish(address, link);
877+
if (address->family == AF_INET6 && !in_addr_is_null(address->family, &address->in_addr_peer))
878+
r = address_add(link, address->family, &address->in_addr_peer, address->prefixlen, &a);
879+
else
880+
r = address_add(link, address->family, &address->in_addr, address->prefixlen, &a);
881+
if (r < 0)
882+
return log_link_error_errno(link, r, "Could not add address: %m");
883+
884+
a->scope = address->scope;
885+
r = address_set_masquerade(a, true);
890886
if (r < 0)
891887
log_link_warning_errno(link, r, "Could not enable IP masquerading, ignoring: %m");
892888

893889
r = netlink_call_async(link->manager->rtnl, NULL, req, callback, link_netlink_destroy_callback, link);
894890
if (r < 0) {
895-
address_release(address);
891+
(void) address_set_masquerade(a, false);
896892
return log_link_error_errno(link, r, "Could not send rtnetlink message: %m");
897893
}
898894

899895
link_ref(link);
900896

901-
if (address->family == AF_INET6 && !in_addr_is_null(address->family, &address->in_addr_peer))
902-
r = address_add(link, address->family, &address->in_addr_peer, address->prefixlen, &a);
903-
else
904-
r = address_add(link, address->family, &address->in_addr, address->prefixlen, &a);
905-
if (r < 0) {
906-
address_release(address);
907-
return log_link_error_errno(link, r, "Could not add address: %m");
908-
}
909-
910897
if (FLAGS_SET(address->duplicate_address_detection, ADDRESS_FAMILY_IPV4)) {
911898
r = ipv4_dad_configure(a);
912899
if (r < 0)

0 commit comments

Comments
 (0)