cloud-setup: azure: ensure that primary address is placed first

The primary address is that placed at position 0 of all the IP Addresses
of the interface. Sometimes we put it in a different position in the
ipv4s array because we insert them in the order we receive, but it might
happen that the HTTP responses comes back in wrong order.

In order to solve this, we pass the index of the IPv4 address to the
callback and the address is added in the right position directly.

Co-authored-by: Fernando Fernandez Mancera <ffmancera@riseup.net>
This commit is contained in:
Íñigo Huguet
2024-08-27 12:08:16 +02:00
committed by Fernando Fernandez Mancera
parent 927cff9f17
commit 72014db629

View File

@@ -102,6 +102,11 @@ typedef struct {
guint n_iface_data_pending; guint n_iface_data_pending;
} AzureIfaceData; } AzureIfaceData;
typedef struct {
AzureIfaceData *iface_data;
guint64 ipaddress_idx;
} AzureIpAddressReqData;
static void static void
_azure_iface_data_destroy(AzureIfaceData *iface_data) _azure_iface_data_destroy(AzureIfaceData *iface_data)
{ {
@@ -112,7 +117,8 @@ static void
_get_config_fetch_done_cb(NMHttpClient *http_client, _get_config_fetch_done_cb(NMHttpClient *http_client,
GAsyncResult *result, GAsyncResult *result,
AzureIfaceData *iface_data, AzureIfaceData *iface_data,
GetConfigFetchType fetch_type) GetConfigFetchType fetch_type,
guint64 ipaddress_idx)
{ {
NMCSProviderGetConfigTaskData *get_config_data; NMCSProviderGetConfigTaskData *get_config_data;
NMCSProviderGetConfigIfaceData *iface_get_config; NMCSProviderGetConfigIfaceData *iface_get_config;
@@ -149,9 +155,7 @@ _get_config_fetch_done_cb(NMHttpClient *http_client,
_LOGD("interface[%" G_GSSIZE_FORMAT "]: received address %s", _LOGD("interface[%" G_GSSIZE_FORMAT "]: received address %s",
iface_data->intern_iface_idx, iface_data->intern_iface_idx,
nm_inet4_ntop(tmp_addr, tmp_addr_str)); nm_inet4_ntop(tmp_addr, tmp_addr_str));
iface_get_config->ipv4s_arr[iface_get_config->ipv4s_len] = tmp_addr; iface_get_config->ipv4s_arr[ipaddress_idx] = tmp_addr;
iface_get_config->has_ipv4s = TRUE;
iface_get_config->ipv4s_len++;
break; break;
case GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_ADDRESS: case GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_ADDRESS:
@@ -203,10 +207,14 @@ _get_config_fetch_done_cb_ipv4_ipaddress_x_privateipaddress(GObject *source
GAsyncResult *result, GAsyncResult *result,
gpointer user_data) gpointer user_data)
{ {
AzureIpAddressReqData *ipaddress_req_data = user_data;
_get_config_fetch_done_cb(NM_HTTP_CLIENT(source), _get_config_fetch_done_cb(NM_HTTP_CLIENT(source),
result, result,
user_data, ipaddress_req_data->iface_data,
GET_CONFIG_FETCH_TYPE_IPV4_IPADDRESS_X_PRIVATEIPADDRESS); GET_CONFIG_FETCH_TYPE_IPV4_IPADDRESS_X_PRIVATEIPADDRESS,
ipaddress_req_data->ipaddress_idx);
g_free(ipaddress_req_data);
} }
static void static void
@@ -217,7 +225,8 @@ _get_config_fetch_done_cb_ipv4_subnet_0_address(GObject *source,
_get_config_fetch_done_cb(NM_HTTP_CLIENT(source), _get_config_fetch_done_cb(NM_HTTP_CLIENT(source),
result, result,
user_data, user_data,
GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_ADDRESS); GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_ADDRESS,
0);
} }
static void static void
@@ -228,7 +237,8 @@ _get_config_fetch_done_cb_ipv4_subnet_0_prefix(GObject *source,
_get_config_fetch_done_cb(NM_HTTP_CLIENT(source), _get_config_fetch_done_cb(NM_HTTP_CLIENT(source),
result, result,
user_data, user_data,
GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_PREFIX); GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_PREFIX,
0);
} }
static void static void
@@ -265,9 +275,10 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u
nm_sprintf_buf(iface_idx_str, "%" G_GSSIZE_FORMAT, iface_data->intern_iface_idx); nm_sprintf_buf(iface_idx_str, "%" G_GSSIZE_FORMAT, iface_data->intern_iface_idx);
while (nm_utils_parse_next_line(&response_str, &response_len, &line, &line_len)) { while (nm_utils_parse_next_line(&response_str, &response_len, &line, &line_len)) {
gint64 ips_prefix_idx; AzureIpAddressReqData *ipaddress_req_data;
gs_free char *uri = NULL; gint64 ips_prefix_idx;
char buf[100]; gs_free char *uri = NULL;
char buf[100];
if (line_len == 0) if (line_len == 0)
continue; continue;
@@ -284,8 +295,11 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u
if (ips_prefix_idx < 0) if (ips_prefix_idx < 0)
continue; continue;
iface_data->n_iface_data_pending++; ipaddress_req_data = g_new(AzureIpAddressReqData, 1);
ipaddress_req_data->iface_data = iface_data;
ipaddress_req_data->ipaddress_idx = ips_prefix_idx;
iface_data->n_iface_data_pending++;
nm_http_client_poll_req( nm_http_client_poll_req(
NM_HTTP_CLIENT(source), NM_HTTP_CLIENT(source),
(uri = _azure_uri_interfaces(iface_idx_str, (uri = _azure_uri_interfaces(iface_idx_str,
@@ -302,11 +316,12 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u
NULL, NULL,
NULL, NULL,
_get_config_fetch_done_cb_ipv4_ipaddress_x_privateipaddress, _get_config_fetch_done_cb_ipv4_ipaddress_x_privateipaddress,
iface_data); ipaddress_req_data);
} }
iface_data->iface_get_config->ipv4s_len = 0;
iface_data->iface_get_config->ipv4s_arr = g_new(in_addr_t, iface_data->n_iface_data_pending); iface_data->iface_get_config->ipv4s_arr = g_new(in_addr_t, iface_data->n_iface_data_pending);
iface_data->iface_get_config->has_ipv4s = TRUE;
iface_data->iface_get_config->ipv4s_len = iface_data->n_iface_data_pending;
{ {
gs_free char *uri = NULL; gs_free char *uri = NULL;