cloud-setup: add "hwaddr" to NMCSProviderGetConfigIfaceData struct

get-config() gives a NMCSProviderGetConfigResult structure, and the
main part of data is the GHashTable of MAC addresses and
NMCSProviderGetConfigIfaceData instances.

Let NMCSProviderGetConfigIfaceData also have a reference to the MAC
address. This way, I'll be able to create a (sorted) list of interface
datas, that also contain the MAC address.
This commit is contained in:
Thomas Haller 2021-09-01 14:34:51 +02:00
parent 5f047968d7
commit ec56fe60fb
No known key found for this signature in database
GPG key ID: 29C2366E4DFC5728
6 changed files with 68 additions and 66 deletions

View file

@ -134,7 +134,6 @@ _get_config_fetch_done_cb(NMHttpClient * http_client,
GetConfigFetchDoneType fetch_type) GetConfigFetchDoneType fetch_type)
{ {
NMCSProviderGetConfigTaskData *get_config_data; NMCSProviderGetConfigTaskData *get_config_data;
const char * hwaddr = NULL;
gs_unref_bytes GBytes *response = NULL; gs_unref_bytes GBytes *response = NULL;
gs_free_error GError * error = NULL; gs_free_error GError * error = NULL;
NMCSProviderGetConfigIfaceData *config_iface_data; NMCSProviderGetConfigIfaceData *config_iface_data;
@ -146,7 +145,7 @@ _get_config_fetch_done_cb(NMHttpClient * http_client,
gsize i; gsize i;
gsize len; gsize len;
nm_utils_user_data_unpack(user_data, &get_config_data, &hwaddr); nm_utils_user_data_unpack(user_data, &get_config_data, &config_iface_data);
nm_http_client_poll_get_finish(http_client, result, NULL, &response, &error); nm_http_client_poll_get_finish(http_client, result, NULL, &response, &error);
@ -156,8 +155,6 @@ _get_config_fetch_done_cb(NMHttpClient * http_client,
if (error) if (error)
goto out; goto out;
config_iface_data = g_hash_table_lookup(get_config_data->result_dict, hwaddr);
switch (fetch_type) { switch (fetch_type) {
case GET_CONFIG_FETCH_DONE_TYPE_PRIVATE_IPV4S: case GET_CONFIG_FETCH_DONE_TYPE_PRIVATE_IPV4S:
@ -300,22 +297,21 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us
gs_free char * uri2 = NULL; gs_free char * uri2 = NULL;
gs_free char * uri3 = NULL; gs_free char * uri3 = NULL;
gs_free char * uri4 = NULL; gs_free char * uri4 = NULL;
const char * hwaddr;
if (!g_hash_table_lookup_extended(get_config_data->result_dict, config_iface_data = g_hash_table_lookup(get_config_data->result_dict, v_hwaddr);
v_hwaddr,
(gpointer *) &hwaddr, if (!config_iface_data) {
(gpointer *) &config_iface_data)) {
if (!get_config_data->any) { if (!get_config_data->any) {
_LOGD("get-config: skip fetching meta data for %s (%s)", _LOGD("get-config: skip fetching meta data for %s (%s)",
v_hwaddr, v_hwaddr,
v_mac_data->path); v_mac_data->path);
continue; continue;
} }
config_iface_data = nmcs_provider_get_config_iface_data_new(FALSE);
g_hash_table_insert(get_config_data->result_dict, config_iface_data =
(char *) (hwaddr = g_strdup(v_hwaddr)), nmcs_provider_get_config_iface_data_create(get_config_data->result_dict,
config_iface_data); FALSE,
v_hwaddr);
} }
nm_assert(config_iface_data->iface_idx == -1); nm_assert(config_iface_data->iface_idx == -1);
@ -324,7 +320,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us
_LOGD("get-config: start fetching meta data for #%" G_GSSIZE_FORMAT ", %s (%s)", _LOGD("get-config: start fetching meta data for #%" G_GSSIZE_FORMAT ", %s (%s)",
config_iface_data->iface_idx, config_iface_data->iface_idx,
hwaddr, config_iface_data->hwaddr,
v_mac_data->path); v_mac_data->path);
get_config_data->n_pending++; get_config_data->n_pending++;
@ -342,7 +338,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us
NULL, NULL,
NULL, NULL,
_get_config_fetch_done_cb_vpc_cidr_block, _get_config_fetch_done_cb_vpc_cidr_block,
nm_utils_user_data_pack(get_config_data, hwaddr)); nm_utils_user_data_pack(get_config_data, config_iface_data));
get_config_data->n_pending++; get_config_data->n_pending++;
nm_http_client_poll_get( nm_http_client_poll_get(
@ -359,7 +355,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us
NULL, NULL,
NULL, NULL,
_get_config_fetch_done_cb_private_ipv4s, _get_config_fetch_done_cb_private_ipv4s,
nm_utils_user_data_pack(get_config_data, hwaddr)); nm_utils_user_data_pack(get_config_data, config_iface_data));
get_config_data->n_pending++; get_config_data->n_pending++;
nm_http_client_poll_get( nm_http_client_poll_get(
@ -376,7 +372,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us
NULL, NULL,
NULL, NULL,
_get_config_fetch_done_cb_netmask, _get_config_fetch_done_cb_netmask,
nm_utils_user_data_pack(get_config_data, hwaddr)); nm_utils_user_data_pack(get_config_data, config_iface_data));
get_config_data->n_pending++; get_config_data->n_pending++;
nm_http_client_poll_get( nm_http_client_poll_get(
@ -393,7 +389,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us
NULL, NULL,
NULL, NULL,
_get_config_fetch_done_cb_gateway, _get_config_fetch_done_cb_gateway,
nm_utils_user_data_pack(get_config_data, hwaddr)); nm_utils_user_data_pack(get_config_data, config_iface_data));
} }
_nmcs_provider_get_config_task_maybe_return(get_config_data, NULL); _nmcs_provider_get_config_task_maybe_return(get_config_data, NULL);

View file

@ -97,7 +97,6 @@ typedef struct {
gssize intern_iface_idx; gssize intern_iface_idx;
gssize extern_iface_idx; gssize extern_iface_idx;
guint n_iface_data_pending; guint n_iface_data_pending;
const char * hwaddr;
} AzureIfaceData; } AzureIfaceData;
static void static void
@ -378,25 +377,24 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data)
goto out_done; goto out_done;
} }
if (!g_hash_table_lookup_extended(get_config_data->result_dict, iface_data->iface_get_config = g_hash_table_lookup(get_config_data->result_dict, v_hwaddr);
v_hwaddr,
(gpointer *) &iface_data->hwaddr, if (!iface_data->iface_get_config) {
(gpointer *) &iface_data->iface_get_config)) {
if (!get_config_data->any) { if (!get_config_data->any) {
_LOGD("get-config: skip fetching meta data for %s (%" G_GSSIZE_FORMAT ")", _LOGD("get-config: skip fetching meta data for %s (%" G_GSSIZE_FORMAT ")",
v_hwaddr, v_hwaddr,
iface_data->intern_iface_idx); iface_data->intern_iface_idx);
goto out_done; goto out_done;
} }
iface_data->iface_get_config = nmcs_provider_get_config_iface_data_new(FALSE); iface_data->iface_get_config =
g_hash_table_insert(get_config_data->result_dict, nmcs_provider_get_config_iface_data_create(get_config_data->result_dict,
(char *) (iface_data->hwaddr = g_steal_pointer(&v_hwaddr)), FALSE,
iface_data->iface_get_config); v_hwaddr);
} else { } else {
if (iface_data->iface_get_config->iface_idx >= 0) { if (iface_data->iface_get_config->iface_idx >= 0) {
_LOGI("interface[%" G_GSSIZE_FORMAT "]: duplicate MAC address %s returned", _LOGI("interface[%" G_GSSIZE_FORMAT "]: duplicate MAC address %s returned",
iface_data->intern_iface_idx, iface_data->intern_iface_idx,
iface_data->hwaddr); iface_data->iface_get_config->hwaddr);
error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN,
"duplicate MAC address for index %" G_GSSIZE_FORMAT, "duplicate MAC address for index %" G_GSSIZE_FORMAT,
iface_data->intern_iface_idx); iface_data->intern_iface_idx);
@ -408,7 +406,7 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data)
_LOGD("interface[%" G_GSSIZE_FORMAT "]: found a matching device with hwaddr %s", _LOGD("interface[%" G_GSSIZE_FORMAT "]: found a matching device with hwaddr %s",
iface_data->intern_iface_idx, iface_data->intern_iface_idx,
iface_data->hwaddr); iface_data->iface_get_config->hwaddr);
nm_sprintf_buf(buf, "%" G_GSSIZE_FORMAT "/ipv4/ipAddress/", iface_data->intern_iface_idx); nm_sprintf_buf(buf, "%" G_GSSIZE_FORMAT "/ipv4/ipAddress/", iface_data->intern_iface_idx);
@ -488,7 +486,6 @@ _get_net_ifaces_list_cb(GObject *source, GAsyncResult *result, gpointer user_dat
.intern_iface_idx = intern_iface_idx, .intern_iface_idx = intern_iface_idx,
.extern_iface_idx = extern_iface_idx_cnt++, .extern_iface_idx = extern_iface_idx_cnt++,
.n_iface_data_pending = 0, .n_iface_data_pending = 0,
.hwaddr = NULL,
}; };
g_ptr_array_add(ifaces_arr, iface_data); g_ptr_array_add(ifaces_arr, iface_data);
} }

View file

@ -122,14 +122,13 @@ _get_config_fetch_done_cb(NMHttpClient *http_client,
gboolean is_local_ipv4) gboolean is_local_ipv4)
{ {
NMCSProviderGetConfigTaskData *get_config_data; NMCSProviderGetConfigTaskData *get_config_data;
const char * hwaddr = NULL;
gs_unref_bytes GBytes *response = NULL; gs_unref_bytes GBytes *response = NULL;
gs_free_error GError * error = NULL; gs_free_error GError * error = NULL;
NMCSProviderGetConfigIfaceData *config_iface_data; NMCSProviderGetConfigIfaceData *config_iface_data;
in_addr_t tmp_addr; in_addr_t tmp_addr;
int tmp_prefix; int tmp_prefix;
nm_utils_user_data_unpack(user_data, &get_config_data, &hwaddr); nm_utils_user_data_unpack(user_data, &get_config_data, &config_iface_data);
nm_http_client_poll_get_finish(http_client, result, NULL, &response, &error); nm_http_client_poll_get_finish(http_client, result, NULL, &response, &error);
@ -139,8 +138,6 @@ _get_config_fetch_done_cb(NMHttpClient *http_client,
if (error) if (error)
goto out; goto out;
config_iface_data = g_hash_table_lookup(get_config_data->result_dict, hwaddr);
if (is_local_ipv4) { if (is_local_ipv4) {
gs_free const char **s_addrs = NULL; gs_free const char **s_addrs = NULL;
gsize i, len; gsize i, len;
@ -236,22 +233,20 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us
NMCSProviderGetConfigIfaceData *config_iface_data; NMCSProviderGetConfigIfaceData *config_iface_data;
gs_free char * uri1 = NULL; gs_free char * uri1 = NULL;
gs_free char * uri2 = NULL; gs_free char * uri2 = NULL;
const char * hwaddr;
if (!g_hash_table_lookup_extended(get_config_data->result_dict, config_iface_data = g_hash_table_lookup(get_config_data->result_dict, v_hwaddr);
v_hwaddr,
(gpointer *) &hwaddr, if (!config_iface_data) {
(gpointer *) &config_iface_data)) {
if (!get_config_data->any) { if (!get_config_data->any) {
_LOGD("get-config: skip fetching meta data for %s (%s)", _LOGD("get-config: skip fetching meta data for %s (%s)",
v_hwaddr, v_hwaddr,
v_mac_data->path); v_mac_data->path);
continue; continue;
} }
config_iface_data = nmcs_provider_get_config_iface_data_new(FALSE); config_iface_data =
g_hash_table_insert(get_config_data->result_dict, nmcs_provider_get_config_iface_data_create(get_config_data->result_dict,
(char *) (hwaddr = g_strdup(v_hwaddr)), FALSE,
config_iface_data); v_hwaddr);
} }
nm_assert(config_iface_data->iface_idx == -1); nm_assert(config_iface_data->iface_idx == -1);
@ -260,7 +255,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us
_LOGD("get-config: start fetching meta data for #%" G_GSSIZE_FORMAT ", %s (%s)", _LOGD("get-config: start fetching meta data for #%" G_GSSIZE_FORMAT ", %s (%s)",
config_iface_data->iface_idx, config_iface_data->iface_idx,
hwaddr, config_iface_data->hwaddr,
v_mac_data->path); v_mac_data->path);
get_config_data->n_pending++; get_config_data->n_pending++;
@ -278,7 +273,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us
NULL, NULL,
NULL, NULL,
_get_config_fetch_done_cb_subnet_ipv4_cidr_block, _get_config_fetch_done_cb_subnet_ipv4_cidr_block,
nm_utils_user_data_pack(get_config_data, hwaddr)); nm_utils_user_data_pack(get_config_data, config_iface_data));
get_config_data->n_pending++; get_config_data->n_pending++;
nm_http_client_poll_get( nm_http_client_poll_get(
@ -295,7 +290,7 @@ _get_config_metadata_ready_cb(GObject *source, GAsyncResult *result, gpointer us
NULL, NULL,
NULL, NULL,
_get_config_fetch_done_cb_local_ipv4s, _get_config_fetch_done_cb_local_ipv4s,
nm_utils_user_data_pack(get_config_data, hwaddr)); nm_utils_user_data_pack(get_config_data, config_iface_data));
} }
_nmcs_provider_get_config_task_maybe_return(get_config_data, NULL); _nmcs_provider_get_config_task_maybe_return(get_config_data, NULL);

View file

@ -247,7 +247,6 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data)
GCPIfaceData * iface_data = user_data; GCPIfaceData * iface_data = user_data;
gs_free_error GError * error = NULL; gs_free_error GError * error = NULL;
gs_free char * v_hwaddr = NULL; gs_free char * v_hwaddr = NULL;
const char * hwaddr = NULL;
gs_free const char * uri = NULL; gs_free const char * uri = NULL;
char sbuf[100]; char sbuf[100];
NMCSProviderGetConfigTaskData *get_config_data; NMCSProviderGetConfigTaskData *get_config_data;
@ -273,26 +272,25 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data)
goto out_done; goto out_done;
} }
if (!g_hash_table_lookup_extended(get_config_data->result_dict, iface_data->iface_get_config = g_hash_table_lookup(get_config_data->result_dict, v_hwaddr);
v_hwaddr,
(gpointer *) &hwaddr, if (!iface_data->iface_get_config) {
(gpointer *) &iface_data->iface_get_config)) {
if (!get_config_data->any) { if (!get_config_data->any) {
_LOGD("get-config: skip fetching meta data for %s (%" G_GSSIZE_FORMAT ")", _LOGD("get-config: skip fetching meta data for %s (%" G_GSSIZE_FORMAT ")",
v_hwaddr, v_hwaddr,
iface_data->intern_iface_idx); iface_data->intern_iface_idx);
goto out_done; goto out_done;
} }
iface_data->iface_get_config = nmcs_provider_get_config_iface_data_new(FALSE); iface_data->iface_get_config =
g_hash_table_insert(get_config_data->result_dict, nmcs_provider_get_config_iface_data_create(get_config_data->result_dict,
(char *) (hwaddr = g_steal_pointer(&v_hwaddr)), FALSE,
iface_data->iface_get_config); v_hwaddr);
is_requested = FALSE; is_requested = FALSE;
} else { } else {
if (iface_data->iface_get_config->iface_idx >= 0) { if (iface_data->iface_get_config->iface_idx >= 0) {
_LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: duplicate MAC address %s returned", _LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: duplicate MAC address %s returned",
iface_data->intern_iface_idx, iface_data->intern_iface_idx,
hwaddr); iface_data->iface_get_config->hwaddr);
error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN, error = nm_utils_error_new(NM_UTILS_ERROR_UNKNOWN,
"duplicate MAC address for index %" G_GSSIZE_FORMAT, "duplicate MAC address for index %" G_GSSIZE_FORMAT,
iface_data->intern_iface_idx); iface_data->intern_iface_idx);
@ -306,7 +304,7 @@ _get_config_iface_cb(GObject *source, GAsyncResult *result, gpointer user_data)
_LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: found a %sdevice with hwaddr %s", _LOGI("GCP interface[%" G_GSSIZE_FORMAT "]: found a %sdevice with hwaddr %s",
iface_data->intern_iface_idx, iface_data->intern_iface_idx,
is_requested ? "requested " : "", is_requested ? "requested " : "",
hwaddr); iface_data->iface_get_config->hwaddr);
nm_sprintf_buf(sbuf, "%" G_GSSIZE_FORMAT "/forwarded-ips/", iface_data->intern_iface_idx); nm_sprintf_buf(sbuf, "%" G_GSSIZE_FORMAT "/forwarded-ips/", iface_data->intern_iface_idx);

View file

@ -127,15 +127,25 @@ nmcs_provider_detect_finish(NMCSProvider *self, GAsyncResult *result, GError **e
/*****************************************************************************/ /*****************************************************************************/
NMCSProviderGetConfigIfaceData * NMCSProviderGetConfigIfaceData *
nmcs_provider_get_config_iface_data_new(gboolean was_requested) nmcs_provider_get_config_iface_data_create(GHashTable *iface_datas,
gboolean was_requested,
const char *hwaddr)
{ {
NMCSProviderGetConfigIfaceData *iface_data; NMCSProviderGetConfigIfaceData *iface_data;
nm_assert(hwaddr);
iface_data = g_slice_new(NMCSProviderGetConfigIfaceData); iface_data = g_slice_new(NMCSProviderGetConfigIfaceData);
*iface_data = (NMCSProviderGetConfigIfaceData){ *iface_data = (NMCSProviderGetConfigIfaceData){
.hwaddr = g_strdup(hwaddr),
.iface_idx = -1, .iface_idx = -1,
.was_requested = was_requested, .was_requested = was_requested,
}; };
/* the has does not own the key (iface_datta->hwaddr), the lifetime of the
* key is associated with the iface_data instance. */
g_hash_table_replace(iface_datas, (char *) iface_data->hwaddr, iface_data);
return iface_data; return iface_data;
} }
@ -146,6 +156,7 @@ _iface_data_free(gpointer data)
g_free(iface_data->ipv4s_arr); g_free(iface_data->ipv4s_arr);
g_free(iface_data->iproutes_arr); g_free(iface_data->iproutes_arr);
g_free((char *) iface_data->hwaddr);
nm_g_slice_free(iface_data); nm_g_slice_free(iface_data);
} }
@ -224,16 +235,13 @@ nmcs_provider_get_config(NMCSProvider * self,
*get_config_data = (NMCSProviderGetConfigTaskData){ *get_config_data = (NMCSProviderGetConfigTaskData){
.task = nm_g_task_new(self, cancellable, nmcs_provider_get_config, callback, user_data), .task = nm_g_task_new(self, cancellable, nmcs_provider_get_config, callback, user_data),
.any = any, .any = any,
.result_dict = g_hash_table_new_full(nm_str_hash, g_str_equal, g_free, _iface_data_free), .result_dict = g_hash_table_new_full(nm_str_hash, g_str_equal, NULL, _iface_data_free),
}; };
nmcs_wait_for_objects_register(get_config_data->task); nmcs_wait_for_objects_register(get_config_data->task);
for (; hwaddrs && hwaddrs[0]; hwaddrs++) { for (; hwaddrs && hwaddrs[0]; hwaddrs++)
g_hash_table_insert(get_config_data->result_dict, nmcs_provider_get_config_iface_data_create(get_config_data->result_dict, TRUE, hwaddrs[0]);
g_strdup(hwaddrs[0]),
nmcs_provider_get_config_iface_data_new(TRUE));
}
if (cancellable) { if (cancellable) {
gulong cancelled_id; gulong cancelled_id;

View file

@ -10,6 +10,10 @@
/*****************************************************************************/ /*****************************************************************************/
typedef struct { typedef struct {
/* And it's exactly the same pointer that is also the key for the iface_datas
* dictionary. */
const char *hwaddr;
in_addr_t *ipv4s_arr; in_addr_t *ipv4s_arr;
gsize ipv4s_len; gsize ipv4s_len;
@ -41,13 +45,17 @@ nmcs_provider_get_config_iface_data_is_valid(const NMCSProviderGetConfigIfaceDat
&& ((config_data->has_ipv4s && config_data->has_cidr) || config_data->iproutes_len); && ((config_data->has_ipv4s && config_data->has_cidr) || config_data->iproutes_len);
} }
NMCSProviderGetConfigIfaceData *nmcs_provider_get_config_iface_data_new(gboolean was_requested); NMCSProviderGetConfigIfaceData *nmcs_provider_get_config_iface_data_create(GHashTable *iface_datas,
gboolean was_requested,
const char *hwaddr);
/*****************************************************************************/ /*****************************************************************************/
typedef struct { typedef struct {
/* A dictionary of (const char *) -> (NMCSProviderGetConfigIfaceData *). /* A dictionary of (const char *) -> (NMCSProviderGetConfigIfaceData *).
* This is the per-interface result of get_config(). */ * This is the per-interface result of get_config().
*
* The key is the same pointer as NMCSProviderGetConfigIfaceData's hwaddr. */
GHashTable *iface_datas; GHashTable *iface_datas;
/* The number of iface_datas that are nmcs_provider_get_config_iface_data_is_valid(). */ /* The number of iface_datas that are nmcs_provider_get_config_iface_data_is_valid(). */