mirror of
https://github.com/systemd/systemd-stable.git
synced 2025-01-25 06:03:40 +03:00
Merge pull request #18555 from yuwata/network-address-set-flag-on-remove
network: address: also set IFA_FLAGS on remove
This commit is contained in:
commit
9ae4f96056
@ -518,6 +518,37 @@ static int address_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, Link
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int address_set_netlink_message(const Address *address, sd_netlink_message *req, Link *link) {
|
||||
int r;
|
||||
|
||||
assert(address);
|
||||
assert(req);
|
||||
assert(link);
|
||||
|
||||
r = sd_rtnl_message_addr_set_prefixlen(req, address->prefixlen);
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Could not set prefixlen: %m");
|
||||
|
||||
/* On remove, only IFA_F_MANAGETEMPADDR flag for IPv6 addresses are used. But anyway, set all
|
||||
* flags here unconditionally. Without setting the flag, the template addresses generated by
|
||||
* kernel will not be removed automatically when the main address is removed. */
|
||||
r = sd_rtnl_message_addr_set_flags(req, address->flags & 0xff);
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Could not set flags: %m");
|
||||
|
||||
if ((address->flags & ~0xff) != 0) {
|
||||
r = sd_netlink_message_append_u32(req, IFA_FLAGS, address->flags);
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Could not set extended flags: %m");
|
||||
}
|
||||
|
||||
r = netlink_message_append_in_addr_union(req, IFA_LOCAL, address->family, &address->in_addr);
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Could not append IFA_LOCAL attribute: %m");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int address_remove(
|
||||
const Address *address,
|
||||
Link *link,
|
||||
@ -540,13 +571,9 @@ int address_remove(
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Could not allocate RTM_DELADDR message: %m");
|
||||
|
||||
r = sd_rtnl_message_addr_set_prefixlen(req, address->prefixlen);
|
||||
r = address_set_netlink_message(address, req, link);
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Could not set prefixlen: %m");
|
||||
|
||||
r = netlink_message_append_in_addr_union(req, IFA_LOCAL, address->family, &address->in_addr);
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Could not append IFA_LOCAL attribute: %m");
|
||||
return r;
|
||||
|
||||
r = netlink_call_async(link->manager->rtnl, NULL, req,
|
||||
callback ?: address_remove_handler,
|
||||
@ -810,7 +837,6 @@ int address_configure(
|
||||
|
||||
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
|
||||
Address *acquired_address, *a;
|
||||
uint32_t flags;
|
||||
bool update;
|
||||
int r, k;
|
||||
|
||||
@ -847,29 +873,14 @@ int address_configure(
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Could not allocate RTM_NEWADDR message: %m");
|
||||
|
||||
r = sd_rtnl_message_addr_set_prefixlen(req, address->prefixlen);
|
||||
r = address_set_netlink_message(address, req, link);
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Could not set prefixlen: %m");
|
||||
|
||||
flags = address->flags | IFA_F_PERMANENT;
|
||||
r = sd_rtnl_message_addr_set_flags(req, flags & 0xff);
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Could not set flags: %m");
|
||||
|
||||
if (flags & ~0xff) {
|
||||
r = sd_netlink_message_append_u32(req, IFA_FLAGS, flags);
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Could not set extended flags: %m");
|
||||
}
|
||||
return r;
|
||||
|
||||
r = sd_rtnl_message_addr_set_scope(req, address->scope);
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Could not set scope: %m");
|
||||
|
||||
r = netlink_message_append_in_addr_union(req, IFA_LOCAL, address->family, &address->in_addr);
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Could not append IFA_LOCAL attribute: %m");
|
||||
|
||||
if (in_addr_is_null(address->family, &address->in_addr_peer) == 0) {
|
||||
r = netlink_message_append_in_addr_union(req, IFA_ADDRESS, address->family, &address->in_addr_peer);
|
||||
if (r < 0)
|
||||
|
@ -1,35 +0,0 @@
|
||||
[Match]
|
||||
Name=dummy98
|
||||
|
||||
[Network]
|
||||
IPv6AcceptRA=no
|
||||
|
||||
# these lines are ignored
|
||||
Address=hogehoge
|
||||
Address=foofoo
|
||||
|
||||
[Route]
|
||||
Gateway=20.20.20.1
|
||||
|
||||
[Address]
|
||||
Address=10.2.3.4/16
|
||||
PreferredLifetime=0
|
||||
Scope=link
|
||||
|
||||
[Address]
|
||||
Address=2001:0db8:0:f101::1/64
|
||||
|
||||
[Address]
|
||||
Address=20.20.20.100/24
|
||||
|
||||
[Address]
|
||||
# this section must be ignored
|
||||
Peer=hoge
|
||||
Address=10.10.0.1/16
|
||||
Label=30
|
||||
|
||||
[Address]
|
||||
# this section must be ignored
|
||||
Label=30
|
||||
Peer=hoge
|
||||
Address=10.10.0.2/16
|
@ -52,6 +52,15 @@ Peer=2001:db8:0:f103::10/128
|
||||
[Address]
|
||||
Address=::/64
|
||||
|
||||
[Address]
|
||||
Address=10.7.8.9/16
|
||||
PreferredLifetime=0
|
||||
Scope=link
|
||||
|
||||
[Address]
|
||||
Address=2001:0db8:1:f101::1/64
|
||||
PreferredLifetime=0
|
||||
|
||||
# test for ENOBUFS issue #17012
|
||||
[Network]
|
||||
Address=10.3.3.1/16
|
||||
|
@ -1753,7 +1753,6 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
|
||||
'25-address-dad-veth99.network',
|
||||
'25-address-link-section.network',
|
||||
'25-address-peer-ipv4.network',
|
||||
'25-address-preferred-lifetime-zero.network',
|
||||
'25-address-static.network',
|
||||
'25-activation-policy.network',
|
||||
'25-bind-carrier.network',
|
||||
@ -1830,38 +1829,40 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
|
||||
|
||||
output = check_output('ip -4 address show dev dummy98')
|
||||
print(output)
|
||||
self.assertRegex(output, 'inet 10.1.2.3/16 brd 10.1.255.255 scope global dummy98')
|
||||
self.assertRegex(output, 'inet 10.1.2.4/16 brd 10.1.255.255 scope global secondary dummy98')
|
||||
self.assertRegex(output, 'inet 10.2.2.4/16 brd 10.2.255.255 scope global dummy98')
|
||||
self.assertIn('inet 10.1.2.3/16 brd 10.1.255.255 scope global dummy98', output)
|
||||
self.assertIn('inet 10.1.2.4/16 brd 10.1.255.255 scope global secondary dummy98', output)
|
||||
self.assertIn('inet 10.2.2.4/16 brd 10.2.255.255 scope global dummy98', output)
|
||||
self.assertIn('inet 10.7.8.9/16 brd 10.7.255.255 scope link deprecated dummy98', output)
|
||||
|
||||
# test for ENOBUFS issue #17012
|
||||
for i in range(1,254):
|
||||
self.assertRegex(output, f'inet 10.3.3.{i}/16 brd 10.3.255.255')
|
||||
self.assertIn(f'inet 10.3.3.{i}/16 brd 10.3.255.255', output)
|
||||
|
||||
# invalid sections
|
||||
self.assertNotRegex(output, '10.10.0.1/16')
|
||||
self.assertNotRegex(output, '10.10.0.2/16')
|
||||
self.assertNotIn('10.10.0.1/16', output)
|
||||
self.assertNotIn('10.10.0.2/16', output)
|
||||
|
||||
output = check_output('ip -4 address show dev dummy98 label 32')
|
||||
self.assertRegex(output, 'inet 10.3.2.3/16 brd 10.3.255.255 scope global 32')
|
||||
self.assertIn('inet 10.3.2.3/16 brd 10.3.255.255 scope global 32', output)
|
||||
|
||||
output = check_output('ip -4 address show dev dummy98 label 33')
|
||||
self.assertRegex(output, 'inet 10.4.2.3 peer 10.4.2.4/16 scope global 33')
|
||||
self.assertIn('inet 10.4.2.3 peer 10.4.2.4/16 scope global 33', output)
|
||||
|
||||
output = check_output('ip -4 address show dev dummy98 label 34')
|
||||
self.assertRegex(output, 'inet 192.168.[0-9]*.1/24 brd 192.168.[0-9]*.255 scope global 34')
|
||||
self.assertRegex(output, r'inet 192.168.[0-9]*.1/24 brd 192.168.[0-9]*.255 scope global 34')
|
||||
|
||||
output = check_output('ip -4 address show dev dummy98 label 35')
|
||||
self.assertRegex(output, 'inet 172.[0-9]*.0.1/16 brd 172.[0-9]*.255.255 scope global 35')
|
||||
self.assertRegex(output, r'inet 172.[0-9]*.0.1/16 brd 172.[0-9]*.255.255 scope global 35')
|
||||
|
||||
output = check_output('ip -6 address show dev dummy98')
|
||||
print(output)
|
||||
self.assertRegex(output, 'inet6 2001:db8:0:f101::15/64 scope global')
|
||||
self.assertRegex(output, 'inet6 2001:db8:0:f101::16/64 scope global')
|
||||
self.assertRegex(output, 'inet6 2001:db8:0:f102::15/64 scope global')
|
||||
self.assertRegex(output, 'inet6 2001:db8:0:f102::16/64 scope global')
|
||||
self.assertRegex(output, 'inet6 2001:db8:0:f103::20 peer 2001:db8:0:f103::10/128 scope global')
|
||||
self.assertRegex(output, 'inet6 fd[0-9a-f:]*1/64 scope global')
|
||||
self.assertIn('inet6 2001:db8:0:f101::15/64 scope global', output)
|
||||
self.assertIn('inet6 2001:db8:0:f101::16/64 scope global', output)
|
||||
self.assertIn('inet6 2001:db8:0:f102::15/64 scope global', output)
|
||||
self.assertIn('inet6 2001:db8:0:f102::16/64 scope global', output)
|
||||
self.assertIn('inet6 2001:db8:0:f103::20 peer 2001:db8:0:f103::10/128 scope global', output)
|
||||
self.assertIn('inet6 2001:db8:1:f101::1/64 scope global deprecated', output)
|
||||
self.assertRegex(output, r'inet6 fd[0-9a-f:]*1/64 scope global')
|
||||
|
||||
restart_networkd()
|
||||
self.wait_online(['dummy98:routable'])
|
||||
@ -1869,22 +1870,7 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
|
||||
# test for ENOBUFS issue #17012
|
||||
output = check_output('ip -4 address show dev dummy98')
|
||||
for i in range(1,254):
|
||||
self.assertRegex(output, f'inet 10.3.3.{i}/16 brd 10.3.255.255')
|
||||
|
||||
def test_address_preferred_lifetime_zero_ipv6(self):
|
||||
copy_unit_to_networkd_unit_path('25-address-preferred-lifetime-zero.network', '12-dummy.netdev')
|
||||
start_networkd(5)
|
||||
|
||||
self.wait_online(['dummy98:routable'])
|
||||
|
||||
output = check_output('ip address show dummy98')
|
||||
print(output)
|
||||
self.assertRegex(output, 'inet 10.2.3.4/16 brd 10.2.255.255 scope link deprecated dummy98')
|
||||
self.assertRegex(output, 'inet6 2001:db8:0:f101::1/64 scope global')
|
||||
|
||||
output = check_output('ip route show dev dummy98')
|
||||
print(output)
|
||||
self.assertRegex(output, 'default via 20.20.20.1 proto static')
|
||||
self.assertIn(f'inet 10.3.3.{i}/16 brd 10.3.255.255', output)
|
||||
|
||||
def test_address_dad(self):
|
||||
copy_unit_to_networkd_unit_path('25-address-dad-veth99.network', '25-address-dad-veth-peer.network',
|
||||
|
Loading…
x
Reference in New Issue
Block a user