nm-dhcp-client: add argument controlling whether to get next or current lease

In the scenario for sending the release message, we need to guarantee
that NM only sends the release message when the client received a lease
from the server. However, there is some distinction between the
`l3cd_curr` and `l3cd_next` when ACD is pending, because `l3cd_curr` is
NULL but `l3cd_next` is not NULL when ACD is pending. Regardless of
whether ACD is pending or completed, these are all considered the client
have received the release from the server. Therefore, adapt the function
`nm_dhcp_client_get_lease()` to control whether to get next or current
lease.
This commit is contained in:
Wen Liang 2024-12-17 14:40:59 -05:00
parent 6819f05644
commit 5993ee8a8a
3 changed files with 19 additions and 4 deletions

View file

@ -11617,7 +11617,7 @@ _dev_ipdhcpx_start(NMDevice *self, int addr_family)
/* Take the NML3ConfigData from the previous lease (if any) that was passed to the NMDhcpClient.
* This may be the old lease only used during the duration of a reapply until we get the
* new lease. */
previous_lease = nm_dhcp_client_get_lease(priv->ipdhcp_data_x[IS_IPv4].client);
previous_lease = nm_dhcp_client_get_lease(priv->ipdhcp_data_x[IS_IPv4].client, TRUE);
if (!priv->ipdhcp_data_x[IS_IPv4].config) {
priv->ipdhcp_data_x[IS_IPv4].config = nm_dhcp_config_new(addr_family, previous_lease);

View file

@ -280,10 +280,25 @@ nm_dhcp_client_create_options_dict(NMDhcpClient *self, gboolean static_keys)
return options;
}
/**
* nm_dhcp_client_get_lease():
* @self: the client
* @ignore_acd_pending: FALSE means to only return the lease that already
* passed ACD, thus it is in use by us. TRUE means to return a new lease
* that might still be pending of Address Collision Detection (ACD) check,
* if there is one, or return the current lease that passed ACD if not.
*
* Returns the current lease that passed ACD or a pending lease still under
* ACD check.
*
*/
const NML3ConfigData *
nm_dhcp_client_get_lease(NMDhcpClient *self)
nm_dhcp_client_get_lease(NMDhcpClient *self, gboolean ignore_acd_pending)
{
return NM_DHCP_CLIENT_GET_PRIVATE(self)->l3cd_curr;
if (ignore_acd_pending)
return NM_DHCP_CLIENT_GET_PRIVATE(self)->l3cd_curr;
else
return NM_DHCP_CLIENT_GET_PRIVATE(self)->l3cd_next;
}
/*****************************************************************************/

View file

@ -246,7 +246,7 @@ const NMDhcpClientConfig *nm_dhcp_client_get_config(NMDhcpClient *self);
pid_t nm_dhcp_client_get_pid(NMDhcpClient *self);
const NML3ConfigData *nm_dhcp_client_get_lease(NMDhcpClient *self);
const NML3ConfigData *nm_dhcp_client_get_lease(NMDhcpClient *self, gboolean ignore_acd_pending);
void nm_dhcp_client_stop(NMDhcpClient *self, gboolean release);