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:

committed by
Fernando Fernandez Mancera

parent
927cff9f17
commit
72014db629
@@ -102,6 +102,11 @@ typedef struct {
|
||||
guint n_iface_data_pending;
|
||||
} AzureIfaceData;
|
||||
|
||||
typedef struct {
|
||||
AzureIfaceData *iface_data;
|
||||
guint64 ipaddress_idx;
|
||||
} AzureIpAddressReqData;
|
||||
|
||||
static void
|
||||
_azure_iface_data_destroy(AzureIfaceData *iface_data)
|
||||
{
|
||||
@@ -112,7 +117,8 @@ static void
|
||||
_get_config_fetch_done_cb(NMHttpClient *http_client,
|
||||
GAsyncResult *result,
|
||||
AzureIfaceData *iface_data,
|
||||
GetConfigFetchType fetch_type)
|
||||
GetConfigFetchType fetch_type,
|
||||
guint64 ipaddress_idx)
|
||||
{
|
||||
NMCSProviderGetConfigTaskData *get_config_data;
|
||||
NMCSProviderGetConfigIfaceData *iface_get_config;
|
||||
@@ -149,9 +155,7 @@ _get_config_fetch_done_cb(NMHttpClient *http_client,
|
||||
_LOGD("interface[%" G_GSSIZE_FORMAT "]: received address %s",
|
||||
iface_data->intern_iface_idx,
|
||||
nm_inet4_ntop(tmp_addr, tmp_addr_str));
|
||||
iface_get_config->ipv4s_arr[iface_get_config->ipv4s_len] = tmp_addr;
|
||||
iface_get_config->has_ipv4s = TRUE;
|
||||
iface_get_config->ipv4s_len++;
|
||||
iface_get_config->ipv4s_arr[ipaddress_idx] = tmp_addr;
|
||||
break;
|
||||
|
||||
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,
|
||||
gpointer user_data)
|
||||
{
|
||||
AzureIpAddressReqData *ipaddress_req_data = user_data;
|
||||
|
||||
_get_config_fetch_done_cb(NM_HTTP_CLIENT(source),
|
||||
result,
|
||||
user_data,
|
||||
GET_CONFIG_FETCH_TYPE_IPV4_IPADDRESS_X_PRIVATEIPADDRESS);
|
||||
ipaddress_req_data->iface_data,
|
||||
GET_CONFIG_FETCH_TYPE_IPV4_IPADDRESS_X_PRIVATEIPADDRESS,
|
||||
ipaddress_req_data->ipaddress_idx);
|
||||
g_free(ipaddress_req_data);
|
||||
}
|
||||
|
||||
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),
|
||||
result,
|
||||
user_data,
|
||||
GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_ADDRESS);
|
||||
GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_ADDRESS,
|
||||
0);
|
||||
}
|
||||
|
||||
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),
|
||||
result,
|
||||
user_data,
|
||||
GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_PREFIX);
|
||||
GET_CONFIG_FETCH_TYPE_IPV4_SUBNET_0_PREFIX,
|
||||
0);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -265,6 +275,7 @@ _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);
|
||||
|
||||
while (nm_utils_parse_next_line(&response_str, &response_len, &line, &line_len)) {
|
||||
AzureIpAddressReqData *ipaddress_req_data;
|
||||
gint64 ips_prefix_idx;
|
||||
gs_free char *uri = NULL;
|
||||
char buf[100];
|
||||
@@ -284,8 +295,11 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u
|
||||
if (ips_prefix_idx < 0)
|
||||
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(source),
|
||||
(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,
|
||||
_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->has_ipv4s = TRUE;
|
||||
iface_data->iface_get_config->ipv4s_len = iface_data->n_iface_data_pending;
|
||||
|
||||
{
|
||||
gs_free char *uri = NULL;
|
||||
|
Reference in New Issue
Block a user