Merge pull request #28573 from yuwata/network-address-next-part2

network: make Address object more consistent with assigned address
This commit is contained in:
Yu Watanabe
2023-07-31 04:14:16 +09:00
committed by GitHub
9 changed files with 515 additions and 435 deletions
+189 -149
View File
@@ -457,43 +457,6 @@ int address_equal(const Address *a1, const Address *a2) {
return address_compare_func(a1, a2) == 0;
}
static int address_equalify(Address *address, const Address *src) {
bool src_is_null;
int r;
assert(address);
assert(src);
src_is_null = address_is_static_null(src);
if (src_is_null) {
/* When the source address has an null address, then we cannot compare the two objects with
* address_kernel_compare_func(). Let's do minimal check here. */
if (address->family != src->family)
return -EINVAL;
if (address->prefixlen != src->prefixlen)
return -EINVAL;
} else if (address_kernel_compare_func(address, src) != 0)
return -EINVAL;
if (address->family == AF_INET) {
/* When the source is null, then the broadcast address will be determined based on the
* acquired address. Hence, do not copy it here. */
if (!src_is_null)
address->broadcast = src->broadcast;
r = free_and_strdup(&address->label, src->label);
if (r < 0)
return r;
} else {
address->prefixlen = src->prefixlen;
address->in_addr_peer = src->in_addr_peer;
}
return 0;
}
int address_dup(const Address *src, Address **ret) {
_cleanup_(address_freep) Address *dest = NULL;
int r;
@@ -626,8 +589,7 @@ static int address_drop(Address *address) {
address_del_netlabel(address);
if (address->state == 0)
address_free(address);
address_free(address);
link_update_operstate(link, /* also_update_master = */ true);
link_check_ready(link);
@@ -655,6 +617,47 @@ static bool address_match_null(const Address *a, const Address *null_address) {
return true;
}
static int address_get_request(Link *link, const Address *address, Request **ret) {
Request *req;
assert(link);
assert(link->manager);
assert(address);
req = ordered_set_get(
link->manager->request_queue,
&(Request) {
.link = link,
.type = REQUEST_TYPE_ADDRESS,
.userdata = (void*) address,
.hash_func = (hash_func_t) address_kernel_hash_func,
.compare_func = (compare_func_t) address_kernel_compare_func,
});
if (req) {
if (ret)
*ret = req;
return 0;
}
if (address_is_static_null(address))
ORDERED_SET_FOREACH(req, link->manager->request_queue) {
if (req->link != link)
continue;
if (req->type != REQUEST_TYPE_ADDRESS)
continue;
if (!address_match_null(req->userdata, address))
continue;
if (ret)
*ret = req;
return 0;
}
return -ENOENT;
}
int address_get(Link *link, const Address *in, Address **ret) {
Address *a;
@@ -682,6 +685,26 @@ int address_get(Link *link, const Address *in, Address **ret) {
return -ENOENT;
}
int address_get_harder(Link *link, const Address *in, Address **ret) {
Request *req;
int r;
assert(link);
assert(in);
if (address_get(link, in, ret) >= 0)
return 0;
r = address_get_request(link, in, &req);
if (r < 0)
return r;
if (ret)
*ret = ASSERT_PTR(req->userdata);
return 0;
}
int link_get_address(Link *link, int family, const union in_addr_union *address, unsigned char prefixlen, Address **ret) {
Address *a;
int r;
@@ -874,6 +897,7 @@ static int address_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, Link
int address_remove(Address *address) {
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL;
Request *req;
Link *link;
int r;
@@ -906,6 +930,8 @@ int address_remove(Address *address) {
link_ref(link);
address_enter_removing(address);
if (address_get_request(link, address, &req) >= 0)
address_enter_removing(req->userdata);
/* The operational state is determined by address state and carrier state. Hence, if we remove
* an address, the operational state may be changed. */
@@ -1275,6 +1301,7 @@ static bool address_is_ready_to_configure(Link *link, const Address *address) {
}
static int address_process_request(Request *req, Link *link, Address *address) {
struct Address *existing;
struct ifa_cacheinfo c;
int r;
@@ -1290,7 +1317,10 @@ static int address_process_request(Request *req, Link *link, Address *address) {
log_link_debug(link, "Refuse to configure %s address %s, as its valid lifetime is zero.",
network_config_source_to_string(address->source),
IN_ADDR_PREFIX_TO_STRING(address->family, &address->in_addr, address->prefixlen));
address_cancel_requesting(address);
if (address_get(link, address, &existing) >= 0)
address_enter_configuring(existing);
return 1;
}
@@ -1299,6 +1329,9 @@ static int address_process_request(Request *req, Link *link, Address *address) {
return log_link_warning_errno(link, r, "Failed to configure address: %m");
address_enter_configuring(address);
if (address_get(link, address, &existing) >= 0)
address_enter_configuring(existing);
return 1;
}
@@ -1309,59 +1342,52 @@ int link_request_address(
address_netlink_handler_t netlink_handler,
Request **ret) {
Address *existing;
_cleanup_(address_freep) Address *tmp = NULL;
Address *existing = NULL;
int r;
assert(link);
assert(address);
assert(address->source != NETWORK_CONFIG_SOURCE_FOREIGN);
if (address_get(link, address, &existing) < 0) {
_cleanup_(address_freep) Address *tmp = NULL;
if (address->lifetime_valid_usec == 0)
/* The requested address is outdated. Let's ignore the request. */
return 0;
if (address->lifetime_valid_usec == 0)
/* The requested address is outdated. Let's ignore the request. */
return 0;
if (address_get(link, address, &existing) < 0) {
if (address_get_request(link, address, NULL) >= 0)
return 0; /* already requested, skipping. */
r = address_acquire(link, address, &tmp);
if (r < 0)
return log_link_warning_errno(link, r, "Failed to acquire an address from pool: %m");
address_set_broadcast(tmp, link);
/* Consider address tentative until we get the real flags from the kernel */
tmp->flags |= IFA_F_TENTATIVE;
r = address_add(link, tmp);
if (r < 0)
return log_link_warning_errno(link, r, "Failed to save requested address: %m");
existing = TAKE_PTR(tmp);
} else {
if (address->lifetime_valid_usec == 0)
/* The requested address is outdated. Let's remove it. */
return address_remove_and_drop(existing);
r = address_equalify(existing, address);
r = address_dup(address, &tmp);
if (r < 0)
return log_link_warning_errno(link, r, "Failed to equalify saved address with the requested one: %m");
return log_oom();
address_set_broadcast(existing, link);
/* Copy already assigned address when it is requested as a null address. */
if (address_is_static_null(address))
tmp->in_addr = existing->in_addr;
existing->source = address->source;
existing->provider = address->provider;
existing->duplicate_address_detection = address->duplicate_address_detection;
existing->lifetime_valid_usec = address->lifetime_valid_usec;
existing->lifetime_preferred_usec = address->lifetime_preferred_usec;
/* Copy state for logging below. */
tmp->state = existing->state;
}
r = ipv4acd_configure(link, existing);
address_set_broadcast(tmp, link);
r = ipv4acd_configure(link, tmp);
if (r < 0)
return r;
log_address_debug(existing, "Requesting", link);
log_address_debug(tmp, "Requesting", link);
r = link_queue_request_safe(link, REQUEST_TYPE_ADDRESS,
existing, NULL,
tmp,
address_free,
address_kernel_hash_func,
address_kernel_compare_func,
address_process_request,
@@ -1371,8 +1397,11 @@ int link_request_address(
if (r == 0)
return 0;
address_enter_requesting(existing);
address_enter_requesting(tmp);
if (existing)
address_enter_requesting(existing);
TAKE_PTR(tmp);
return 1;
}
@@ -1464,6 +1493,8 @@ int manager_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message,
Link *link;
uint16_t type;
Address *address = NULL;
Request *req = NULL;
bool is_new = false;
int ifindex, r;
assert(rtnl);
@@ -1509,6 +1540,8 @@ int manager_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message,
if (r < 0)
return log_oom();
/* First, read minimal information to make address_get() work below. */
r = sd_rtnl_message_addr_get_family(message, &tmp->family);
if (r < 0) {
log_link_warning(link, "rtnl: received address message without family, ignoring.");
@@ -1524,26 +1557,6 @@ int manager_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message,
return 0;
}
r = sd_rtnl_message_addr_get_scope(message, &tmp->scope);
if (r < 0) {
log_link_warning_errno(link, r, "rtnl: received address message without scope, ignoring: %m");
return 0;
}
r = sd_netlink_message_read_u32(message, IFA_FLAGS, &tmp->flags);
if (r == -ENODATA) {
unsigned char flags;
/* For old kernels. */
r = sd_rtnl_message_addr_get_flags(message, &flags);
if (r >= 0)
tmp->flags = flags;
}
if (r < 0) {
log_link_warning_errno(link, r, "rtnl: received address message without flags, ignoring: %m");
return 0;
}
switch (tmp->family) {
case AF_INET:
r = sd_netlink_message_read_in_addr(message, IFA_LOCAL, &tmp->in_addr.in);
@@ -1561,19 +1574,6 @@ int manager_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message,
tmp->in_addr_peer = IN_ADDR_NULL;
}
r = sd_netlink_message_read_in_addr(message, IFA_BROADCAST, &tmp->broadcast);
if (r < 0 && r != -ENODATA) {
log_link_warning_errno(link, r, "rtnl: could not get broadcast from address message, ignoring: %m");
return 0;
}
r = sd_netlink_message_read_string_strdup(message, IFA_LABEL, &tmp->label);
if (r < 0 && r != -ENODATA) {
log_link_warning_errno(link, r, "rtnl: could not get label from address message, ignoring: %m");
return 0;
} else if (r >= 0 && streq_ptr(tmp->label, link->ifname))
tmp->label = mfree(tmp->label);
break;
case AF_INET6:
@@ -1603,65 +1603,105 @@ int manager_rtnl_process_address(sd_netlink *rtnl, sd_netlink_message *message,
assert_not_reached();
}
r = sd_netlink_message_read_cache_info(message, IFA_CACHEINFO, &cinfo);
if (r < 0 && r != -ENODATA) {
log_link_warning_errno(link, r, "rtnl: cannot get IFA_CACHEINFO attribute, ignoring: %m");
return 0;
}
/* Then, find the managed Address and Request objects corresponding to the received address. */
(void) address_get(link, tmp, &address);
(void) address_get_request(link, tmp, &req);
switch (type) {
case RTM_NEWADDR:
if (address) {
/* update flags and etc. */
r = address_equalify(address, tmp);
if (r < 0) {
log_link_warning_errno(link, r, "Failed to update properties of address %s, ignoring: %m",
IN_ADDR_PREFIX_TO_STRING(address->family, &address->in_addr, address->prefixlen));
return 0;
}
address->flags = tmp->flags;
address->scope = tmp->scope;
address_set_lifetime(m, address, &cinfo);
address_enter_configured(address);
log_address_debug(address, "Received updated", link);
} else {
address_set_lifetime(m, tmp, &cinfo);
address_enter_configured(tmp);
log_address_debug(tmp, "Received new", link);
r = address_add(link, tmp);
if (r < 0) {
log_link_warning_errno(link, r, "Failed to remember foreign address %s, ignoring: %m",
IN_ADDR_PREFIX_TO_STRING(tmp->family, &tmp->in_addr, tmp->prefixlen));
return 0;
}
address = TAKE_PTR(tmp);
}
/* address_update() logs internally, so we don't need to here. */
r = address_update(address);
if (r < 0)
link_enter_failed(link);
break;
case RTM_DELADDR:
if (type == RTM_DELADDR) {
if (address) {
address_enter_removed(address);
log_address_debug(address, address->state == 0 ? "Forgetting" : "Removed", link);
log_address_debug(address, "Forgetting removed", link);
(void) address_drop(address);
} else
log_address_debug(tmp, "Kernel removed unknown", link);
break;
if (req)
address_enter_removed(req->userdata);
default:
assert_not_reached();
return 0;
}
if (!address) {
/* If we did not know the address, then save it. */
r = address_add(link, tmp);
if (r < 0) {
log_link_warning_errno(link, r, "Failed to remember foreign address %s, ignoring: %m",
IN_ADDR_PREFIX_TO_STRING(tmp->family, &tmp->in_addr, tmp->prefixlen));
return 0;
}
address = TAKE_PTR(tmp);
is_new = true;
} else {
/* Otherwise, update the managed Address object with the netlink notification. */
address->prefixlen = tmp->prefixlen;
address->in_addr_peer = tmp->in_addr_peer;
}
/* Also update information that cannot be obtained through netlink notification. */
if (req && req->waiting_reply) {
Address *a = ASSERT_PTR(req->userdata);
address->source = a->source;
address->provider = a->provider;
(void) free_and_strdup_warn(&address->netlabel, a->netlabel);
address->requested_as_null = a->requested_as_null;
address->callback = a->callback;
}
/* Then, update miscellaneous info. */
r = sd_rtnl_message_addr_get_scope(message, &address->scope);
if (r < 0)
log_link_debug_errno(link, r, "rtnl: received address message without scope, ignoring: %m");
if (address->family == AF_INET) {
_cleanup_free_ char *label = NULL;
r = sd_netlink_message_read_string_strdup(message, IFA_LABEL, &label);
if (r >= 0) {
if (!streq_ptr(label, link->ifname))
free_and_replace(address->label, label);
} else if (r != -ENODATA)
log_link_debug_errno(link, r, "rtnl: could not get label from address message, ignoring: %m");
r = sd_netlink_message_read_in_addr(message, IFA_BROADCAST, &address->broadcast);
if (r < 0 && r != -ENODATA)
log_link_debug_errno(link, r, "rtnl: could not get broadcast from address message, ignoring: %m");
}
r = sd_netlink_message_read_u32(message, IFA_FLAGS, &address->flags);
if (r == -ENODATA) {
unsigned char flags;
/* For old kernels. */
r = sd_rtnl_message_addr_get_flags(message, &flags);
if (r >= 0)
address->flags = flags;
} else if (r < 0)
log_link_debug_errno(link, r, "rtnl: failed to read IFA_FLAGS attribute, ignoring: %m");
r = sd_netlink_message_read_cache_info(message, IFA_CACHEINFO, &cinfo);
if (r >= 0)
address_set_lifetime(m, address, &cinfo);
else if (r != -ENODATA)
log_link_debug_errno(link, r, "rtnl: failed to read IFA_CACHEINFO attribute, ignoring: %m");
r = sd_netlink_message_read_u32(message, IFA_RT_PRIORITY, &address->route_metric);
if (r < 0 && r != -ENODATA)
log_link_debug_errno(link, r, "rtnl: failed to read IFA_RT_PRIORITY attribute, ignoring: %m");
address_enter_configured(address);
if (req)
address_enter_configured(req->userdata);
log_address_debug(address, is_new ? "Received new": "Received updated", link);
/* address_update() logs internally, so we don't need to here. */
r = address_update(address);
if (r < 0)
link_enter_failed(link);
return 1;
}
+1
View File
@@ -73,6 +73,7 @@ int address_flags_to_string_alloc(uint32_t flags, int family, char **ret);
int address_new(Address **ret);
Address* address_free(Address *address);
int address_get(Link *link, const Address *in, Address **ret);
int address_get_harder(Link *link, const Address *in, Address **ret);
int address_configure_handler_internal(sd_netlink *rtnl, sd_netlink_message *m, Link *link, const char *error_msg);
int address_remove(Address *address);
int address_remove_and_drop(Address *address);
@@ -359,7 +359,7 @@ static void log_dhcp_pd_address(Link *link, const Address *address) {
assert(address);
assert(address->family == AF_INET6);
int log_level = address_get(link, address, NULL) >= 0 ? LOG_DEBUG : LOG_INFO;
int log_level = address_get_harder(link, address, NULL) >= 0 ? LOG_DEBUG : LOG_INFO;
if (log_level < log_get_max_level())
return;
+2 -2
View File
@@ -108,8 +108,8 @@ int link_request_dhcp_server_address(Link *link) {
address->prefixlen = link->network->dhcp_server_address_prefixlen;
address_set_broadcast(address, link);
if (address_get(link, address, &existing) >= 0 &&
address_exists(existing) &&
if (address_get_harder(link, address, &existing) >= 0 &&
(address_exists(existing) || address_is_requesting(existing)) &&
existing->source == NETWORK_CONFIG_SOURCE_STATIC)
/* The same address seems explicitly configured in [Address] or [Network] section.
* Configure the DHCP server address only when it is not. */
+1 -1
View File
@@ -161,7 +161,7 @@ static int verify_dhcp6_address(Link *link, const Address *address) {
const char *pretty = IN6_ADDR_TO_STRING(&address->in_addr.in6);
if (address_get(link, address, &existing) < 0) {
if (address_get_harder(link, address, &existing) < 0) {
/* New address. */
log_level = LOG_INFO;
goto simple_log;
@@ -55,6 +55,10 @@ Address=2001:db8:0:f102::16/64
Address=2001:db8:0:f103::20/128
Peer=2001:db8:0:f103::10/128
[Address]
Address=2001:db8:0:f104::16/64
RouteMetric=128
[Address]
Address=::/64
@@ -105,263 +109,6 @@ RouteMetric=128
Address=10.9.0.1/16
RouteMetric=hoge
# test for ENOBUFS issue #17012
[Network]
Address=10.3.3.1/16
Address=10.3.3.2/16
Address=10.3.3.3/16
Address=10.3.3.4/16
Address=10.3.3.5/16
Address=10.3.3.6/16
Address=10.3.3.7/16
Address=10.3.3.8/16
Address=10.3.3.9/16
Address=10.3.3.10/16
Address=10.3.3.11/16
Address=10.3.3.12/16
Address=10.3.3.13/16
Address=10.3.3.14/16
Address=10.3.3.15/16
Address=10.3.3.16/16
Address=10.3.3.17/16
Address=10.3.3.18/16
Address=10.3.3.19/16
Address=10.3.3.20/16
Address=10.3.3.21/16
Address=10.3.3.22/16
Address=10.3.3.23/16
Address=10.3.3.24/16
Address=10.3.3.25/16
Address=10.3.3.26/16
Address=10.3.3.27/16
Address=10.3.3.28/16
Address=10.3.3.29/16
Address=10.3.3.30/16
Address=10.3.3.31/16
Address=10.3.3.32/16
Address=10.3.3.33/16
Address=10.3.3.34/16
Address=10.3.3.35/16
Address=10.3.3.36/16
Address=10.3.3.37/16
Address=10.3.3.38/16
Address=10.3.3.39/16
Address=10.3.3.40/16
Address=10.3.3.41/16
Address=10.3.3.42/16
Address=10.3.3.43/16
Address=10.3.3.44/16
Address=10.3.3.45/16
Address=10.3.3.46/16
Address=10.3.3.47/16
Address=10.3.3.48/16
Address=10.3.3.49/16
Address=10.3.3.50/16
Address=10.3.3.51/16
Address=10.3.3.52/16
Address=10.3.3.53/16
Address=10.3.3.54/16
Address=10.3.3.55/16
Address=10.3.3.56/16
Address=10.3.3.57/16
Address=10.3.3.58/16
Address=10.3.3.59/16
Address=10.3.3.60/16
Address=10.3.3.61/16
Address=10.3.3.62/16
Address=10.3.3.63/16
Address=10.3.3.64/16
Address=10.3.3.65/16
Address=10.3.3.66/16
Address=10.3.3.67/16
Address=10.3.3.68/16
Address=10.3.3.69/16
Address=10.3.3.70/16
Address=10.3.3.71/16
Address=10.3.3.72/16
Address=10.3.3.73/16
Address=10.3.3.74/16
Address=10.3.3.75/16
Address=10.3.3.76/16
Address=10.3.3.77/16
Address=10.3.3.78/16
Address=10.3.3.79/16
Address=10.3.3.80/16
Address=10.3.3.81/16
Address=10.3.3.82/16
Address=10.3.3.83/16
Address=10.3.3.84/16
Address=10.3.3.85/16
Address=10.3.3.86/16
Address=10.3.3.87/16
Address=10.3.3.88/16
Address=10.3.3.89/16
Address=10.3.3.90/16
Address=10.3.3.91/16
Address=10.3.3.92/16
Address=10.3.3.93/16
Address=10.3.3.94/16
Address=10.3.3.95/16
Address=10.3.3.96/16
Address=10.3.3.97/16
Address=10.3.3.98/16
Address=10.3.3.99/16
Address=10.3.3.100/16
Address=10.3.3.101/16
Address=10.3.3.102/16
Address=10.3.3.103/16
Address=10.3.3.104/16
Address=10.3.3.105/16
Address=10.3.3.106/16
Address=10.3.3.107/16
Address=10.3.3.108/16
Address=10.3.3.109/16
Address=10.3.3.110/16
Address=10.3.3.111/16
Address=10.3.3.112/16
Address=10.3.3.113/16
Address=10.3.3.114/16
Address=10.3.3.115/16
Address=10.3.3.116/16
Address=10.3.3.117/16
Address=10.3.3.118/16
Address=10.3.3.119/16
Address=10.3.3.120/16
Address=10.3.3.121/16
Address=10.3.3.122/16
Address=10.3.3.123/16
Address=10.3.3.124/16
Address=10.3.3.125/16
Address=10.3.3.126/16
Address=10.3.3.127/16
Address=10.3.3.128/16
Address=10.3.3.129/16
Address=10.3.3.130/16
Address=10.3.3.131/16
Address=10.3.3.132/16
Address=10.3.3.133/16
Address=10.3.3.134/16
Address=10.3.3.135/16
Address=10.3.3.136/16
Address=10.3.3.137/16
Address=10.3.3.138/16
Address=10.3.3.139/16
Address=10.3.3.140/16
Address=10.3.3.141/16
Address=10.3.3.142/16
Address=10.3.3.143/16
Address=10.3.3.144/16
Address=10.3.3.145/16
Address=10.3.3.146/16
Address=10.3.3.147/16
Address=10.3.3.148/16
Address=10.3.3.149/16
Address=10.3.3.150/16
Address=10.3.3.151/16
Address=10.3.3.152/16
Address=10.3.3.153/16
Address=10.3.3.154/16
Address=10.3.3.155/16
Address=10.3.3.156/16
Address=10.3.3.157/16
Address=10.3.3.158/16
Address=10.3.3.159/16
Address=10.3.3.160/16
Address=10.3.3.161/16
Address=10.3.3.162/16
Address=10.3.3.163/16
Address=10.3.3.164/16
Address=10.3.3.165/16
Address=10.3.3.166/16
Address=10.3.3.167/16
Address=10.3.3.168/16
Address=10.3.3.169/16
Address=10.3.3.170/16
Address=10.3.3.171/16
Address=10.3.3.172/16
Address=10.3.3.173/16
Address=10.3.3.174/16
Address=10.3.3.175/16
Address=10.3.3.176/16
Address=10.3.3.177/16
Address=10.3.3.178/16
Address=10.3.3.179/16
Address=10.3.3.180/16
Address=10.3.3.181/16
Address=10.3.3.182/16
Address=10.3.3.183/16
Address=10.3.3.184/16
Address=10.3.3.185/16
Address=10.3.3.186/16
Address=10.3.3.187/16
Address=10.3.3.188/16
Address=10.3.3.189/16
Address=10.3.3.190/16
Address=10.3.3.191/16
Address=10.3.3.192/16
Address=10.3.3.193/16
Address=10.3.3.194/16
Address=10.3.3.195/16
Address=10.3.3.196/16
Address=10.3.3.197/16
Address=10.3.3.198/16
Address=10.3.3.199/16
Address=10.3.3.200/16
Address=10.3.3.201/16
Address=10.3.3.202/16
Address=10.3.3.203/16
Address=10.3.3.204/16
Address=10.3.3.205/16
Address=10.3.3.206/16
Address=10.3.3.207/16
Address=10.3.3.208/16
Address=10.3.3.209/16
Address=10.3.3.210/16
Address=10.3.3.211/16
Address=10.3.3.212/16
Address=10.3.3.213/16
Address=10.3.3.214/16
Address=10.3.3.215/16
Address=10.3.3.216/16
Address=10.3.3.217/16
Address=10.3.3.218/16
Address=10.3.3.219/16
Address=10.3.3.220/16
Address=10.3.3.221/16
Address=10.3.3.222/16
Address=10.3.3.223/16
Address=10.3.3.224/16
Address=10.3.3.225/16
Address=10.3.3.226/16
Address=10.3.3.227/16
Address=10.3.3.228/16
Address=10.3.3.229/16
Address=10.3.3.230/16
Address=10.3.3.231/16
Address=10.3.3.232/16
Address=10.3.3.233/16
Address=10.3.3.234/16
Address=10.3.3.235/16
Address=10.3.3.236/16
Address=10.3.3.237/16
Address=10.3.3.238/16
Address=10.3.3.239/16
Address=10.3.3.240/16
Address=10.3.3.241/16
Address=10.3.3.242/16
Address=10.3.3.243/16
Address=10.3.3.244/16
Address=10.3.3.245/16
Address=10.3.3.246/16
Address=10.3.3.247/16
Address=10.3.3.248/16
Address=10.3.3.249/16
Address=10.3.3.250/16
Address=10.3.3.251/16
Address=10.3.3.252/16
Address=10.3.3.253/16
Address=10.3.3.254/16
[Address]
Address=10.4.3.2/24
# just a random label which should exist
@@ -0,0 +1,258 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Network]
# test for ENOBUFS issue #17012
Address=10.3.3.1/16
Address=10.3.3.2/16
Address=10.3.3.3/16
Address=10.3.3.4/16
Address=10.3.3.5/16
Address=10.3.3.6/16
Address=10.3.3.7/16
Address=10.3.3.8/16
Address=10.3.3.9/16
Address=10.3.3.10/16
Address=10.3.3.11/16
Address=10.3.3.12/16
Address=10.3.3.13/16
Address=10.3.3.14/16
Address=10.3.3.15/16
Address=10.3.3.16/16
Address=10.3.3.17/16
Address=10.3.3.18/16
Address=10.3.3.19/16
Address=10.3.3.20/16
Address=10.3.3.21/16
Address=10.3.3.22/16
Address=10.3.3.23/16
Address=10.3.3.24/16
Address=10.3.3.25/16
Address=10.3.3.26/16
Address=10.3.3.27/16
Address=10.3.3.28/16
Address=10.3.3.29/16
Address=10.3.3.30/16
Address=10.3.3.31/16
Address=10.3.3.32/16
Address=10.3.3.33/16
Address=10.3.3.34/16
Address=10.3.3.35/16
Address=10.3.3.36/16
Address=10.3.3.37/16
Address=10.3.3.38/16
Address=10.3.3.39/16
Address=10.3.3.40/16
Address=10.3.3.41/16
Address=10.3.3.42/16
Address=10.3.3.43/16
Address=10.3.3.44/16
Address=10.3.3.45/16
Address=10.3.3.46/16
Address=10.3.3.47/16
Address=10.3.3.48/16
Address=10.3.3.49/16
Address=10.3.3.50/16
Address=10.3.3.51/16
Address=10.3.3.52/16
Address=10.3.3.53/16
Address=10.3.3.54/16
Address=10.3.3.55/16
Address=10.3.3.56/16
Address=10.3.3.57/16
Address=10.3.3.58/16
Address=10.3.3.59/16
Address=10.3.3.60/16
Address=10.3.3.61/16
Address=10.3.3.62/16
Address=10.3.3.63/16
Address=10.3.3.64/16
Address=10.3.3.65/16
Address=10.3.3.66/16
Address=10.3.3.67/16
Address=10.3.3.68/16
Address=10.3.3.69/16
Address=10.3.3.70/16
Address=10.3.3.71/16
Address=10.3.3.72/16
Address=10.3.3.73/16
Address=10.3.3.74/16
Address=10.3.3.75/16
Address=10.3.3.76/16
Address=10.3.3.77/16
Address=10.3.3.78/16
Address=10.3.3.79/16
Address=10.3.3.80/16
Address=10.3.3.81/16
Address=10.3.3.82/16
Address=10.3.3.83/16
Address=10.3.3.84/16
Address=10.3.3.85/16
Address=10.3.3.86/16
Address=10.3.3.87/16
Address=10.3.3.88/16
Address=10.3.3.89/16
Address=10.3.3.90/16
Address=10.3.3.91/16
Address=10.3.3.92/16
Address=10.3.3.93/16
Address=10.3.3.94/16
Address=10.3.3.95/16
Address=10.3.3.96/16
Address=10.3.3.97/16
Address=10.3.3.98/16
Address=10.3.3.99/16
Address=10.3.3.100/16
Address=10.3.3.101/16
Address=10.3.3.102/16
Address=10.3.3.103/16
Address=10.3.3.104/16
Address=10.3.3.105/16
Address=10.3.3.106/16
Address=10.3.3.107/16
Address=10.3.3.108/16
Address=10.3.3.109/16
Address=10.3.3.110/16
Address=10.3.3.111/16
Address=10.3.3.112/16
Address=10.3.3.113/16
Address=10.3.3.114/16
Address=10.3.3.115/16
Address=10.3.3.116/16
Address=10.3.3.117/16
Address=10.3.3.118/16
Address=10.3.3.119/16
Address=10.3.3.120/16
Address=10.3.3.121/16
Address=10.3.3.122/16
Address=10.3.3.123/16
Address=10.3.3.124/16
Address=10.3.3.125/16
Address=10.3.3.126/16
Address=10.3.3.127/16
Address=10.3.3.128/16
Address=10.3.3.129/16
Address=10.3.3.130/16
Address=10.3.3.131/16
Address=10.3.3.132/16
Address=10.3.3.133/16
Address=10.3.3.134/16
Address=10.3.3.135/16
Address=10.3.3.136/16
Address=10.3.3.137/16
Address=10.3.3.138/16
Address=10.3.3.139/16
Address=10.3.3.140/16
Address=10.3.3.141/16
Address=10.3.3.142/16
Address=10.3.3.143/16
Address=10.3.3.144/16
Address=10.3.3.145/16
Address=10.3.3.146/16
Address=10.3.3.147/16
Address=10.3.3.148/16
Address=10.3.3.149/16
Address=10.3.3.150/16
Address=10.3.3.151/16
Address=10.3.3.152/16
Address=10.3.3.153/16
Address=10.3.3.154/16
Address=10.3.3.155/16
Address=10.3.3.156/16
Address=10.3.3.157/16
Address=10.3.3.158/16
Address=10.3.3.159/16
Address=10.3.3.160/16
Address=10.3.3.161/16
Address=10.3.3.162/16
Address=10.3.3.163/16
Address=10.3.3.164/16
Address=10.3.3.165/16
Address=10.3.3.166/16
Address=10.3.3.167/16
Address=10.3.3.168/16
Address=10.3.3.169/16
Address=10.3.3.170/16
Address=10.3.3.171/16
Address=10.3.3.172/16
Address=10.3.3.173/16
Address=10.3.3.174/16
Address=10.3.3.175/16
Address=10.3.3.176/16
Address=10.3.3.177/16
Address=10.3.3.178/16
Address=10.3.3.179/16
Address=10.3.3.180/16
Address=10.3.3.181/16
Address=10.3.3.182/16
Address=10.3.3.183/16
Address=10.3.3.184/16
Address=10.3.3.185/16
Address=10.3.3.186/16
Address=10.3.3.187/16
Address=10.3.3.188/16
Address=10.3.3.189/16
Address=10.3.3.190/16
Address=10.3.3.191/16
Address=10.3.3.192/16
Address=10.3.3.193/16
Address=10.3.3.194/16
Address=10.3.3.195/16
Address=10.3.3.196/16
Address=10.3.3.197/16
Address=10.3.3.198/16
Address=10.3.3.199/16
Address=10.3.3.200/16
Address=10.3.3.201/16
Address=10.3.3.202/16
Address=10.3.3.203/16
Address=10.3.3.204/16
Address=10.3.3.205/16
Address=10.3.3.206/16
Address=10.3.3.207/16
Address=10.3.3.208/16
Address=10.3.3.209/16
Address=10.3.3.210/16
Address=10.3.3.211/16
Address=10.3.3.212/16
Address=10.3.3.213/16
Address=10.3.3.214/16
Address=10.3.3.215/16
Address=10.3.3.216/16
Address=10.3.3.217/16
Address=10.3.3.218/16
Address=10.3.3.219/16
Address=10.3.3.220/16
Address=10.3.3.221/16
Address=10.3.3.222/16
Address=10.3.3.223/16
Address=10.3.3.224/16
Address=10.3.3.225/16
Address=10.3.3.226/16
Address=10.3.3.227/16
Address=10.3.3.228/16
Address=10.3.3.229/16
Address=10.3.3.230/16
Address=10.3.3.231/16
Address=10.3.3.232/16
Address=10.3.3.233/16
Address=10.3.3.234/16
Address=10.3.3.235/16
Address=10.3.3.236/16
Address=10.3.3.237/16
Address=10.3.3.238/16
Address=10.3.3.239/16
Address=10.3.3.240/16
Address=10.3.3.241/16
Address=10.3.3.242/16
Address=10.3.3.243/16
Address=10.3.3.244/16
Address=10.3.3.245/16
Address=10.3.3.246/16
Address=10.3.3.247/16
Address=10.3.3.248/16
Address=10.3.3.249/16
Address=10.3.3.250/16
Address=10.3.3.251/16
Address=10.3.3.252/16
Address=10.3.3.253/16
Address=10.3.3.254/16
@@ -0,0 +1,9 @@
# SPDX-License-Identifier: LGPL-2.1-or-later
[Address]
Address=10.9.0.1/16
RouteMetric=256
[Address]
Address=2001:db8:0:f104::16/64
RouteMetric=256
+50 -25
View File
@@ -2329,20 +2329,8 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
def tearDown(self):
tear_down_common()
def test_address_static(self):
# test for #22515. The address will be removed and replaced with /64 prefix.
check_output('ip link add dummy98 type dummy')
check_output('ip link set dev dummy98 up')
check_output('ip -6 address add 2001:db8:0:f101::15/128 dev dummy98')
self.wait_address('dummy98', '2001:db8:0:f101::15/128', ipv='-6')
check_output('ip -4 address add 10.3.2.3/16 brd 10.3.255.250 scope global label dummy98:hoge dev dummy98')
self.wait_address('dummy98', '10.3.2.3/16 brd 10.3.255.250', ipv='-4')
copy_network_unit('25-address-static.network', '12-dummy.netdev')
start_networkd()
self.wait_online(['dummy98:routable'])
def verify_address_static(self, route_metric):
# IPv4 addresses
output = check_output('ip -4 address show dev dummy98')
print(output)
self.assertIn('inet 10.1.2.3/16 brd 10.1.255.255 scope global dummy98', output)
@@ -2351,16 +2339,13 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
self.assertIn('inet 10.7.8.9/16 brd 10.7.255.255 scope link deprecated dummy98', output)
self.assertIn('inet 10.8.8.1/16 scope global dummy98', output)
self.assertIn('inet 10.8.8.2/16 brd 10.8.8.128 scope global secondary dummy98', output)
self.assertRegex(output, 'inet 10.9.0.1/16 (metric 128 |)brd 10.9.255.255 scope global dummy98')
# test for ENOBUFS issue #17012
for i in range(1, 254):
self.assertIn(f'inet 10.3.3.{i}/16 brd 10.3.255.255', output)
self.assertRegex(output, rf'inet 10.9.0.1/16 (metric {route_metric} |)brd 10.9.255.255 scope global dummy98')
# invalid sections
self.assertNotIn('10.10.0.1/16', output)
self.assertNotIn('10.10.0.2/16', output)
# address labels
output = check_output('ip -4 address show dev dummy98 label 32')
self.assertIn('inet 10.3.2.3/16 brd 10.3.255.255 scope global 32', output)
@@ -2373,10 +2358,15 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
output = check_output('ip -4 address show dev dummy98 label 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 -4 route show dev dummy98')
# check metric of prefix route
output = check_output('ip -4 route show dev dummy98 10.9.0.0/16')
print(output)
self.assertIn('10.9.0.0/16 proto kernel scope link src 10.9.0.1 metric 128', output)
self.assertIn(f'10.9.0.0/16 proto kernel scope link src 10.9.0.1 metric {route_metric}', output)
output = check_output('ip -6 route show dev dummy98 2001:db8:0:f104::/64')
print(output)
self.assertIn(f'2001:db8:0:f104::/64 proto kernel metric {route_metric}', output)
# IPv6 addresses
output = check_output('ip -6 address show dev dummy98')
print(output)
self.assertIn('inet6 2001:db8:0:f101::15/64 scope global', output)
@@ -2384,11 +2374,40 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
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.assertRegex(output, rf'inet6 2001:db8:0:f104::16/64 (metric {route_metric} |)scope global')
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')
# netlabel
self.check_netlabel('dummy98', r'10\.4\.3\.0/24')
output = check_output(*networkctl_cmd, '--json=short', 'status', env=env)
check_json(output)
def test_address_static(self):
# test for #22515. The address will be removed and replaced with /64 prefix.
check_output('ip link add dummy98 type dummy')
check_output('ip link set dev dummy98 up')
check_output('ip -6 address add 2001:db8:0:f101::15/128 dev dummy98')
self.wait_address('dummy98', '2001:db8:0:f101::15/128', ipv='-6')
check_output('ip -4 address add 10.3.2.3/16 brd 10.3.255.250 scope global label dummy98:hoge dev dummy98')
self.wait_address('dummy98', '10.3.2.3/16 brd 10.3.255.250', ipv='-4')
copy_network_unit('25-address-static.network', '12-dummy.netdev', copy_dropins=False)
start_networkd()
self.wait_online(['dummy98:routable'])
self.verify_address_static(route_metric=128)
copy_network_unit('25-address-static.network.d/10-override-route-metric.conf')
networkctl_reload()
self.wait_online(['dummy98:routable'])
self.verify_address_static(route_metric=256)
networkctl_reconfigure('dummy98')
self.wait_online(['dummy98:routable'])
self.verify_address_static(route_metric=256)
# Tests for #20891.
# 1. set preferred lifetime forever to drop the deprecated flag for testing #20891.
check_output('ip address change 10.7.8.9/16 dev dummy98 preferred_lft forever')
@@ -2412,14 +2431,20 @@ class NetworkdNetworkTests(unittest.TestCase, Utilities):
print(output)
self.assertIn('inet6 2001:db8:1:f101::1/64 scope global deprecated', output)
# test for ENOBUFS issue #17012
# test for ENOBUFS issue #17012 (with reload)
copy_network_unit('25-address-static.network.d/10-many-address.conf')
networkctl_reload()
self.wait_online(['dummy98:routable'])
output = check_output('ip -4 address show dev dummy98')
for i in range(1, 254):
self.assertIn(f'inet 10.3.3.{i}/16 brd 10.3.255.255', output)
output = check_output(*networkctl_cmd, '--json=short', 'status', env=env)
check_json(output)
# (with reconfigure)
networkctl_reconfigure('dummy98')
self.wait_online(['dummy98:routable'])
output = check_output('ip -4 address show dev dummy98')
for i in range(1, 254):
self.assertIn(f'inet 10.3.3.{i}/16 brd 10.3.255.255', output)
def test_address_null(self):
copy_network_unit('25-address-null.network', '12-dummy.netdev')