diff options
author | Thomas Haller <thaller@redhat.com> | 2021-01-05 18:31:30 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2021-01-06 12:58:51 +0100 |
commit | 7d0b347d35d579d2e1eb19b519426cbe910f4e01 (patch) | |
tree | e071d1790180dc13fbde0a1fa5bd9a312cb29153 | |
parent | 1003cb79c1517e9b7f665da372eb1230d9f41378 (diff) | |
download | NetworkManager-7d0b347d35d579d2e1eb19b519426cbe910f4e01.tar.gz |
cloud-setup: assign incremental iface_idx for Azure,GCP get_config() result
We use the iface_idx for example to determine the routing table,
by using table 30400+iface_idx.
While the HTTP API for Azure has a index, it does not mean that we
should use that index as-is for our purpose.
Instead, treat those indexes separately and ensure that the
iface_idx that we return is numbering the interfaces starting
from zero.
-rw-r--r-- | clients/cloud-setup/nmcs-provider-azure.c | 43 | ||||
-rw-r--r-- | clients/cloud-setup/nmcs-provider-gcp.c | 42 |
2 files changed, 46 insertions, 39 deletions
diff --git a/clients/cloud-setup/nmcs-provider-azure.c b/clients/cloud-setup/nmcs-provider-azure.c index 8474adc577..97c4725bfc 100644 --- a/clients/cloud-setup/nmcs-provider-azure.c +++ b/clients/cloud-setup/nmcs-provider-azure.c @@ -96,7 +96,8 @@ detect(NMCSProvider *provider, GTask *task) typedef struct { NMCSProviderGetConfigTaskData * get_config_data; NMCSProviderGetConfigIfaceData *iface_get_config; - gssize iface_idx; + gssize intern_iface_idx; + gssize extern_iface_idx; guint n_ips_prefix_pending; const char * hwaddr; } AzureIfaceData; @@ -147,7 +148,7 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, goto done; } _LOGD("interface[%" G_GSSIZE_FORMAT "]: adding private ip %s", - iface_data->iface_idx, + iface_data->intern_iface_idx, _nm_utils_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; @@ -162,14 +163,14 @@ _get_config_fetch_done_cb(NMHttpClient * http_client, tmp_prefix = _nm_utils_ascii_str_to_int64(fip_str, 10, 0, 32, -1); if (tmp_prefix == -1) { - _LOGD("interface[%" G_GSSIZE_FORMAT "]: invalid prefix", iface_data->iface_idx); + _LOGD("interface[%" G_GSSIZE_FORMAT "]: invalid prefix", iface_data->intern_iface_idx); error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, "subnet does not give a valid prefix"); goto done; } _LOGD("interface[%" G_GSSIZE_FORMAT "]: adding prefix %d", - iface_data->iface_idx, + iface_data->intern_iface_idx, tmp_prefix); iface_get_config->cidr_prefix = tmp_prefix; iface_get_config->has_cidr = TRUE; @@ -259,7 +260,7 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u (uri = _azure_uri_interfaces(nm_sprintf_buf( buf, "%" G_GSSIZE_FORMAT "/ipv4/ipAddress/%" G_GINT64_FORMAT "/privateIpAddress", - iface_data->iface_idx, + iface_data->intern_iface_idx, ips_prefix_idx))), HTTP_TIMEOUT_MS, 512 * 1024, @@ -285,7 +286,7 @@ _get_config_ips_prefix_list_cb(GObject *source, GAsyncResult *result, gpointer u nm_http_client_poll_get( NM_HTTP_CLIENT(source), (uri = _azure_uri_interfaces( - nm_sprintf_buf(buf, "%" G_GSSIZE_FORMAT, iface_data->iface_idx), + nm_sprintf_buf(buf, "%" G_GSSIZE_FORMAT, iface_data->intern_iface_idx), "/ipv4/subnet/0/prefix/")), HTTP_TIMEOUT_MS, 512 * 1024, @@ -332,10 +333,10 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data) v_hwaddr = nmcs_utils_hwaddr_normalize_gbytes(response); if (!v_hwaddr) { _LOGI("interface[%" G_GSSIZE_FORMAT "]: invalid MAC address returned", - iface_data->iface_idx); + iface_data->intern_iface_idx); error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, "invalid MAC address for index %" G_GSSIZE_FORMAT, - iface_data->iface_idx); + iface_data->intern_iface_idx); goto out_done; } @@ -346,7 +347,7 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data) if (!get_config_data->any) { _LOGD("get-config: skip fetching meta data for %s (%" G_GSSIZE_FORMAT ")", v_hwaddr, - iface_data->iface_idx); + iface_data->intern_iface_idx); goto out_done; } iface_data->iface_get_config = nmcs_provider_get_config_iface_data_new(FALSE); @@ -356,22 +357,22 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data) } else { if (iface_data->iface_get_config->iface_idx >= 0) { _LOGI("interface[%" G_GSSIZE_FORMAT "]: duplicate MAC address %s returned", - iface_data->iface_idx, + iface_data->intern_iface_idx, iface_data->hwaddr); error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, "duplicate MAC address for index %" G_GSSIZE_FORMAT, - iface_data->iface_idx); + iface_data->intern_iface_idx); goto out_done; } } - iface_data->iface_get_config->iface_idx = iface_data->iface_idx; + iface_data->iface_get_config->iface_idx = iface_data->extern_iface_idx; _LOGD("interface[%" G_GSSIZE_FORMAT "]: found a matching device with hwaddr %s", - iface_data->iface_idx, + iface_data->intern_iface_idx, iface_data->hwaddr); - nm_sprintf_buf(buf, "%" G_GSSIZE_FORMAT "/ipv4/ipAddress/", iface_data->iface_idx); + nm_sprintf_buf(buf, "%" G_GSSIZE_FORMAT "/ipv4/ipAddress/", iface_data->intern_iface_idx); nm_http_client_poll_get(NM_HTTP_CLIENT(source), (uri = _azure_uri_interfaces(buf)), @@ -407,6 +408,7 @@ _get_net_ifaces_list_cb(GObject *source, GAsyncResult *result, gpointer user_dat const char * line; gsize line_len; guint i; + gssize extern_iface_idx_cnt = 0; nm_http_client_poll_get_finish(NM_HTTP_CLIENT(source), result, NULL, &response, &error); @@ -428,7 +430,7 @@ _get_net_ifaces_list_cb(GObject *source, GAsyncResult *result, gpointer user_dat while (nm_utils_parse_next_line(&response_str, &response_len, &line, &line_len)) { AzureIfaceData *iface_data; - gssize iface_idx; + gssize intern_iface_idx; if (line_len == 0) continue; @@ -440,15 +442,16 @@ _get_net_ifaces_list_cb(GObject *source, GAsyncResult *result, gpointer user_dat if (line[line_len - 1] == '/' && line_len != 0) ((char *) line)[--line_len] = '\0'; - iface_idx = _nm_utils_ascii_str_to_int64(line, 10, 0, G_MAXSSIZE, -1); - if (iface_idx < 0) + intern_iface_idx = _nm_utils_ascii_str_to_int64(line, 10, 0, G_MAXSSIZE, -1); + if (intern_iface_idx < 0) continue; iface_data = g_slice_new(AzureIfaceData); *iface_data = (AzureIfaceData){ .get_config_data = get_config_data, .iface_get_config = NULL, - .iface_idx = iface_idx, + .intern_iface_idx = intern_iface_idx, + .extern_iface_idx = extern_iface_idx_cnt++, .n_ips_prefix_pending = 0, .hwaddr = NULL, }; @@ -469,9 +472,9 @@ _get_net_ifaces_list_cb(GObject *source, GAsyncResult *result, gpointer user_dat char buf[100]; _LOGD("azure interface[%" G_GSSIZE_FORMAT "]: retrieving configuration", - iface_data->iface_idx); + iface_data->intern_iface_idx); - nm_sprintf_buf(buf, "%" G_GSSIZE_FORMAT "/macAddress", iface_data->iface_idx); + nm_sprintf_buf(buf, "%" G_GSSIZE_FORMAT "/macAddress", iface_data->intern_iface_idx); get_config_data->n_pending++; nm_http_client_poll_get(NM_HTTP_CLIENT(source), diff --git a/clients/cloud-setup/nmcs-provider-gcp.c b/clients/cloud-setup/nmcs-provider-gcp.c index 8786780d9e..af78bce646 100644 --- a/clients/cloud-setup/nmcs-provider-gcp.c +++ b/clients/cloud-setup/nmcs-provider-gcp.c @@ -91,7 +91,8 @@ detect(NMCSProvider *provider, GTask *task) typedef struct { NMCSProviderGetConfigTaskData * get_config_data; NMCSProviderGetConfigIfaceData *iface_get_config; - gssize iface_idx; + gssize intern_iface_idx; + gssize extern_iface_idx; guint n_fips_pending; } GCPIfaceData; @@ -109,7 +110,7 @@ _get_config_fip_cb(GObject *source, GAsyncResult *result, gpointer user_data) gs_unref_bytes GBytes *response = NULL; GCPIfaceData * iface_data = user_data; gs_free_error GError *error = NULL; - gs_free char * ipaddr = NULL; + gs_free char * ipaddr = NULL; NMIPRoute ** routes_arr; NMIPRoute * route_new; @@ -131,7 +132,7 @@ _get_config_fip_cb(GObject *source, GAsyncResult *result, gpointer user_data) } _LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: adding forwarded-ip %s", - iface_data->iface_idx, + iface_data->intern_iface_idx, ipaddr); iface_get_config = iface_data->iface_get_config; @@ -198,14 +199,14 @@ _get_config_ips_list_cb(GObject *source, GAsyncResult *result, gpointer user_dat g_ptr_array_add(uri_arr, g_strdup_printf("%" G_GSSIZE_FORMAT "/forwarded-ips/%" G_GINT64_FORMAT, - iface_data->iface_idx, + iface_data->intern_iface_idx, fip_index)); } iface_data->n_fips_pending = uri_arr->len; _LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: found %u forwarded ips", - iface_data->iface_idx, + iface_data->intern_iface_idx, iface_data->n_fips_pending); if (iface_data->n_fips_pending == 0) { @@ -268,10 +269,10 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data) v_hwaddr = nmcs_utils_hwaddr_normalize_gbytes(response); if (!v_hwaddr) { _LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: invalid MAC address returned", - iface_data->iface_idx); + iface_data->intern_iface_idx); error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, "invalid MAC address for index %" G_GSSIZE_FORMAT, - iface_data->iface_idx); + iface_data->intern_iface_idx); goto out_done; } @@ -282,7 +283,7 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data) if (!get_config_data->any) { _LOGD("get-config: skip fetching meta data for %s (%" G_GSSIZE_FORMAT ")", v_hwaddr, - iface_data->iface_idx); + iface_data->intern_iface_idx); goto out_done; } iface_data->iface_get_config = nmcs_provider_get_config_iface_data_new(FALSE); @@ -293,24 +294,24 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data) } else { if (iface_data->iface_get_config->iface_idx >= 0) { _LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: duplicate MAC address %s returned", - iface_data->iface_idx, + iface_data->intern_iface_idx, hwaddr); error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, "duplicate MAC address for index %" G_GSSIZE_FORMAT, - iface_data->iface_idx); + iface_data->intern_iface_idx); goto out_done; } is_requested = TRUE; } - iface_data->iface_get_config->iface_idx = iface_data->iface_idx; + iface_data->iface_get_config->iface_idx = iface_data->extern_iface_idx; _LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: found a %sdevice with hwaddr %s", - iface_data->iface_idx, + iface_data->intern_iface_idx, is_requested ? "requested " : "", hwaddr); - nm_sprintf_buf(sbuf, "%" G_GSSIZE_FORMAT "/forwarded-ips/", iface_data->iface_idx); + nm_sprintf_buf(sbuf, "%" G_GSSIZE_FORMAT "/forwarded-ips/", iface_data->intern_iface_idx); nm_http_client_poll_get(NM_HTTP_CLIENT(source), (uri = _gcp_uri_interfaces(sbuf)), @@ -346,6 +347,7 @@ _get_net_ifaces_list_cb(GObject *source, GAsyncResult *result, gpointer user_dat const char * line; gsize line_len; guint i; + gssize extern_iface_idx_cnt = 0; nm_http_client_poll_get_finish(NM_HTTP_CLIENT(source), result, NULL, &response, &error); @@ -367,7 +369,7 @@ _get_net_ifaces_list_cb(GObject *source, GAsyncResult *result, gpointer user_dat while (nm_utils_parse_next_line(&response_str, &response_len, &line, &line_len)) { GCPIfaceData *iface_data; - gssize iface_idx; + gssize intern_iface_idx; if (line_len == 0) continue; @@ -378,15 +380,16 @@ _get_net_ifaces_list_cb(GObject *source, GAsyncResult *result, gpointer user_dat if (line[line_len - 1] == '/') ((char *) line)[--line_len] = '\0'; - iface_idx = _nm_utils_ascii_str_to_int64(line, 10, 0, G_MAXSSIZE, -1); - if (iface_idx < 0) + intern_iface_idx = _nm_utils_ascii_str_to_int64(line, 10, 0, G_MAXSSIZE, -1); + if (intern_iface_idx < 0) continue; iface_data = g_slice_new(GCPIfaceData); *iface_data = (GCPIfaceData){ .get_config_data = get_config_data, .iface_get_config = NULL, - .iface_idx = iface_idx, + .intern_iface_idx = intern_iface_idx, + .extern_iface_idx = extern_iface_idx_cnt++, .n_fips_pending = 0, }; g_ptr_array_add(ifaces_arr, iface_data); @@ -406,9 +409,10 @@ _get_net_ifaces_list_cb(GObject *source, GAsyncResult *result, gpointer user_dat gs_free const char *uri = NULL; char sbuf[100]; - _LOGD("GCP interface[%" G_GSSIZE_FORMAT "]: retrieving configuration", data->iface_idx); + _LOGD("GCP interface[%" G_GSSIZE_FORMAT "]: retrieving configuration", + data->intern_iface_idx); - nm_sprintf_buf(sbuf, "%" G_GSSIZE_FORMAT "/mac", data->iface_idx); + nm_sprintf_buf(sbuf, "%" G_GSSIZE_FORMAT "/mac", data->intern_iface_idx); get_config_data->n_pending++; nm_http_client_poll_get(NM_HTTP_CLIENT(source), |