diff options
Diffstat (limited to 'src/initrd/nmi-ibft-reader.c')
| -rw-r--r-- | src/initrd/nmi-ibft-reader.c | 755 |
1 files changed, 394 insertions, 361 deletions
diff --git a/src/initrd/nmi-ibft-reader.c b/src/initrd/nmi-ibft-reader.c index fe6f6432..80b2e5f9 100644 --- a/src/initrd/nmi-ibft-reader.c +++ b/src/initrd/nmi-ibft-reader.c @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: LGPL-2.1+ +/* SPDX-License-Identifier: LGPL-2.1+ */ /* * Copyright (C) 2014 - 2018 Red Hat, Inc. */ @@ -22,408 +22,441 @@ /*****************************************************************************/ #define _NMLOG(level, domain, ...) \ - nm_log ((level), (domain), NULL, NULL, \ - "ibft-reader: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__) \ - _NM_UTILS_MACRO_REST (__VA_ARGS__)) + nm_log((level), \ + (domain), \ + NULL, \ + NULL, \ + "ibft-reader: " _NM_UTILS_MACRO_FIRST(__VA_ARGS__) _NM_UTILS_MACRO_REST(__VA_ARGS__)) /*****************************************************************************/ static GHashTable * -load_one_nic (const char *sysfs_dir, const char *dir_name) +load_one_nic(const char *sysfs_dir, const char *dir_name) { - gs_free char *nic_path = g_build_filename (sysfs_dir, dir_name, NULL); - GDir *nic_dir; - const char *entry_name; - char *content; - gs_free_error GError *error = NULL; - GHashTable *nic; - - g_return_val_if_fail (sysfs_dir != NULL, FALSE); - - nic_dir = g_dir_open (nic_path, 0, &error); - if (!nic_dir) { - _LOGW (LOGD_CORE, "Can't open %s: %s", nic_path, error->message); - return NULL; - } - - nic = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, g_free); - while ((entry_name = g_dir_read_name (nic_dir))) { - gs_free char *entry_path = g_build_filename (nic_path, entry_name, NULL); - - if (!g_file_test (entry_path, G_FILE_TEST_IS_REGULAR)) - continue; - - if (!g_file_get_contents (entry_path, &content, NULL, &error)) { - _LOGW (LOGD_CORE, "Can't read %s: %s", entry_path, error->message); - g_clear_error (&error); - continue; - } - - g_strchomp (content); - if (!g_hash_table_insert (nic, g_strdup (entry_name), content)) - _LOGW (LOGD_CORE, "Duplicate iBFT entry: %s", entry_name); - } - - g_dir_close (nic_dir); - - return nic; + gs_free char *nic_path = g_build_filename(sysfs_dir, dir_name, NULL); + GDir * nic_dir; + const char * entry_name; + char * content; + gs_free_error GError *error = NULL; + GHashTable * nic; + + g_return_val_if_fail(sysfs_dir != NULL, FALSE); + + nic_dir = g_dir_open(nic_path, 0, &error); + if (!nic_dir) { + _LOGW(LOGD_CORE, "Can't open %s: %s", nic_path, error->message); + return NULL; + } + + nic = g_hash_table_new_full(nm_str_hash, g_str_equal, g_free, g_free); + while ((entry_name = g_dir_read_name(nic_dir))) { + gs_free char *entry_path = g_build_filename(nic_path, entry_name, NULL); + + if (!g_file_test(entry_path, G_FILE_TEST_IS_REGULAR)) + continue; + + if (!g_file_get_contents(entry_path, &content, NULL, &error)) { + _LOGW(LOGD_CORE, "Can't read %s: %s", entry_path, error->message); + g_clear_error(&error); + continue; + } + + g_strchomp(content); + if (!g_hash_table_insert(nic, g_strdup(entry_name), content)) + _LOGW(LOGD_CORE, "Duplicate iBFT entry: %s", entry_name); + } + + g_dir_close(nic_dir); + + return nic; } GHashTable * -nmi_ibft_read (const char *sysfs_dir) +nmi_ibft_read(const char *sysfs_dir) { - gs_free char *ibft_path = NULL; - GDir *ibft_dir; - const char *dir_name; - GHashTable *ibft, *nic; - char *mac; - gs_free_error GError *error = NULL; - - g_return_val_if_fail (sysfs_dir != NULL, FALSE); - - ibft_path = g_build_filename (sysfs_dir, "firmware", "ibft", NULL); - - ibft = g_hash_table_new_full (nm_str_hash, g_str_equal, g_free, - (GDestroyNotify) g_hash_table_unref); - - if (!g_file_test (ibft_path, G_FILE_TEST_IS_DIR)) - nm_utils_modprobe (NULL, FALSE, "iscsi_ibft", NULL); - if (!g_file_test (ibft_path, G_FILE_TEST_IS_DIR)) - return ibft; - - ibft_dir = g_dir_open (ibft_path, 0, &error); - if (!ibft_dir) { - _LOGW (LOGD_CORE, "Unable to open iBFT firmware directory: %s", error->message); - return ibft; - } - - while ((dir_name = g_dir_read_name (ibft_dir))) { - if (!g_str_has_prefix (dir_name, "ethernet")) - continue; - - nic = load_one_nic (ibft_path, dir_name); - mac = g_hash_table_lookup (nic, "mac"); - - if (!mac) { - _LOGW (LOGD_CORE, "Ignoring an iBFT record without a MAC address"); - g_hash_table_unref (nic); - continue; - } - - mac = g_ascii_strup (mac, -1); - if (!g_hash_table_insert (ibft, mac, nic)) - _LOGW (LOGD_CORE, "Duplicate iBFT record for %s", mac); - } - - g_dir_close (ibft_dir); - - return ibft; + gs_free char *ibft_path = NULL; + GDir * ibft_dir; + const char * dir_name; + GHashTable * ibft, *nic; + char * mac; + gs_free_error GError *error = NULL; + + g_return_val_if_fail(sysfs_dir != NULL, FALSE); + + ibft_path = g_build_filename(sysfs_dir, "firmware", "ibft", NULL); + + ibft = g_hash_table_new_full(nm_str_hash, + g_str_equal, + g_free, + (GDestroyNotify) g_hash_table_unref); + + if (!g_file_test(ibft_path, G_FILE_TEST_IS_DIR)) + nm_utils_modprobe(NULL, FALSE, "iscsi_ibft", NULL); + if (!g_file_test(ibft_path, G_FILE_TEST_IS_DIR)) + return ibft; + + ibft_dir = g_dir_open(ibft_path, 0, &error); + if (!ibft_dir) { + _LOGW(LOGD_CORE, "Unable to open iBFT firmware directory: %s", error->message); + return ibft; + } + + while ((dir_name = g_dir_read_name(ibft_dir))) { + if (!g_str_has_prefix(dir_name, "ethernet")) + continue; + + nic = load_one_nic(ibft_path, dir_name); + mac = g_hash_table_lookup(nic, "mac"); + + if (!mac) { + _LOGW(LOGD_CORE, "Ignoring an iBFT record without a MAC address"); + g_hash_table_unref(nic); + continue; + } + + mac = g_ascii_strup(mac, -1); + if (!g_hash_table_insert(ibft, mac, nic)) + _LOGW(LOGD_CORE, "Duplicate iBFT record for %s", mac); + } + + g_dir_close(ibft_dir); + + return ibft; } static gboolean -ip_setting_add_from_block (GHashTable *nic, - NMConnection *connection, - GError **error) +ip_setting_add_from_block(GHashTable *nic, NMConnection *connection, GError **error) { - NMSettingIPConfig *s_ip = NULL; - NMSettingIPConfig *s_ip4 = NULL; - NMSettingIPConfig *s_ip6 = NULL; - NMIPAddress *addr; - const char *s_ipaddr = NULL; - const char *s_prefix = NULL; - const char *s_gateway = NULL; - const char *s_dns1 = NULL; - const char *s_dns2 = NULL; - const char *s_origin = NULL; - const char *method = NULL; - int family; - gint64 prefix; - - s_ipaddr = (const char *)g_hash_table_lookup (nic, "ip-addr"); - s_prefix = (const char *)g_hash_table_lookup (nic, "prefix-len"); - s_gateway = (const char *)g_hash_table_lookup (nic, "gateway"); - s_dns1 = (const char *)g_hash_table_lookup (nic, "primary-dns"); - s_dns2 = (const char *)g_hash_table_lookup (nic, "secondary-dns"); - s_origin = (const char *)g_hash_table_lookup (nic, "origin"); - - s_ip4 = nm_connection_get_setting_ip4_config (connection); - if (!s_ip4) { - s_ip4 = (NMSettingIPConfig *) nm_setting_ip4_config_new (); - nm_connection_add_setting (connection, (NMSetting *) s_ip4); - } - - s_ip6 = nm_connection_get_setting_ip6_config (connection); - if (!s_ip6) { - s_ip6 = (NMSettingIPConfig *) nm_setting_ip6_config_new (); - nm_connection_add_setting (connection, (NMSetting *) s_ip6); - - g_object_set (s_ip6, - NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE, (int) NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64, - NULL); - } - - family = guess_ip_address_family (s_ipaddr); - if (family == AF_UNSPEC) - family = guess_ip_address_family (s_gateway); - - switch (family) { - case AF_INET: - s_ip = s_ip4; - g_object_set (s_ip6, NM_SETTING_IP_CONFIG_METHOD, - NM_SETTING_IP6_CONFIG_METHOD_DISABLED, NULL); - break; - case AF_INET6: - s_ip = s_ip6; - g_object_set (s_ip4, NM_SETTING_IP_CONFIG_METHOD, - NM_SETTING_IP4_CONFIG_METHOD_DISABLED, NULL); - break; - default: - g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, - "iBFT: invalid IP address '%s'.", - s_ipaddr); - return FALSE; - } - - if ( (nm_streq0 (s_origin, "3") && family == AF_INET) - || (nm_streq0 (s_origin, "4") && family == AF_INET)) { - method = NM_SETTING_IP4_CONFIG_METHOD_AUTO; - } else if (nm_streq0 (s_origin, "3") && family == AF_INET6) { - method = NM_SETTING_IP6_CONFIG_METHOD_DHCP; - } else if (nm_streq0 (s_origin, "4") && family == AF_INET6) { - method = NM_SETTING_IP6_CONFIG_METHOD_AUTO; - } else if (family == AF_INET) { - method = NM_SETTING_IP4_CONFIG_METHOD_MANUAL; - } else if (family == AF_INET6) { - method = NM_SETTING_IP6_CONFIG_METHOD_MANUAL; - } else { - g_return_val_if_reached (FALSE); - } - g_object_set (s_ip, - NM_SETTING_IP_CONFIG_METHOD, method, - NM_SETTING_IP_CONFIG_MAY_FAIL, FALSE, - NULL); - - if (s_gateway && !nm_utils_ipaddr_is_valid (family, s_gateway)) { - g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, - "iBFT: invalid IP gateway '%s'.", s_gateway); - return FALSE; - } - - if (s_dns1 && !nm_utils_ipaddr_is_valid (family, s_dns1)) { - g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, - "iBFT: invalid DNS1 address '%s'.", s_dns1); - return FALSE; - } - - if (s_dns2 && !nm_utils_ipaddr_is_valid (family, s_dns2)) { - g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, - "iBFT: invalid DNS2 address '%s'.", s_dns2); - return FALSE; - } - - if (s_ipaddr) { - prefix = _nm_utils_ascii_str_to_int64 (s_prefix, 10, 0, 128, -1); - if (prefix == -1) { - g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, - "iBFT: invalid IP prefix '%s'.", s_prefix); - return FALSE; - } - - addr = nm_ip_address_new (family, s_ipaddr, prefix, error); - if (!addr) { - g_prefix_error (error, "iBFT: "); - return FALSE; - } - - nm_setting_ip_config_add_address (s_ip, addr); - nm_ip_address_unref (addr); - - g_object_set (s_ip, NM_SETTING_IP_CONFIG_GATEWAY, s_gateway, NULL); - } - - if (s_dns1) - nm_setting_ip_config_add_dns (s_ip, s_dns1); - if (s_dns2) - nm_setting_ip_config_add_dns (s_ip, s_dns2); - - return TRUE; + NMSettingIPConfig *s_ip = NULL; + NMSettingIPConfig *s_ip4 = NULL; + NMSettingIPConfig *s_ip6 = NULL; + NMIPAddress * addr; + const char * s_ipaddr = NULL; + const char * s_prefix = NULL; + const char * s_gateway = NULL; + const char * s_dns1 = NULL; + const char * s_dns2 = NULL; + const char * s_origin = NULL; + const char * method = NULL; + int family; + gint64 prefix; + + s_ipaddr = (const char *) g_hash_table_lookup(nic, "ip-addr"); + s_prefix = (const char *) g_hash_table_lookup(nic, "prefix-len"); + s_gateway = (const char *) g_hash_table_lookup(nic, "gateway"); + s_dns1 = (const char *) g_hash_table_lookup(nic, "primary-dns"); + s_dns2 = (const char *) g_hash_table_lookup(nic, "secondary-dns"); + s_origin = (const char *) g_hash_table_lookup(nic, "origin"); + + s_ip4 = nm_connection_get_setting_ip4_config(connection); + if (!s_ip4) { + s_ip4 = (NMSettingIPConfig *) nm_setting_ip4_config_new(); + nm_connection_add_setting(connection, (NMSetting *) s_ip4); + } + + s_ip6 = nm_connection_get_setting_ip6_config(connection); + if (!s_ip6) { + s_ip6 = (NMSettingIPConfig *) nm_setting_ip6_config_new(); + nm_connection_add_setting(connection, (NMSetting *) s_ip6); + + g_object_set(s_ip6, + NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE, + (int) NM_SETTING_IP6_CONFIG_ADDR_GEN_MODE_EUI64, + NULL); + } + + family = guess_ip_address_family(s_ipaddr); + if (family == AF_UNSPEC) + family = guess_ip_address_family(s_gateway); + + switch (family) { + case AF_INET: + s_ip = s_ip4; + g_object_set(s_ip6, + NM_SETTING_IP_CONFIG_METHOD, + NM_SETTING_IP6_CONFIG_METHOD_DISABLED, + NULL); + break; + case AF_INET6: + s_ip = s_ip6; + g_object_set(s_ip4, + NM_SETTING_IP_CONFIG_METHOD, + NM_SETTING_IP4_CONFIG_METHOD_DISABLED, + NULL); + break; + default: + g_set_error(error, + NM_SETTINGS_ERROR, + NM_SETTINGS_ERROR_INVALID_CONNECTION, + "iBFT: invalid IP address '%s'.", + s_ipaddr); + return FALSE; + } + + if ((nm_streq0(s_origin, "3") && family == AF_INET) + || (nm_streq0(s_origin, "4") && family == AF_INET)) { + method = NM_SETTING_IP4_CONFIG_METHOD_AUTO; + } else if (nm_streq0(s_origin, "3") && family == AF_INET6) { + method = NM_SETTING_IP6_CONFIG_METHOD_DHCP; + } else if (nm_streq0(s_origin, "4") && family == AF_INET6) { + method = NM_SETTING_IP6_CONFIG_METHOD_AUTO; + } else if (family == AF_INET) { + method = NM_SETTING_IP4_CONFIG_METHOD_MANUAL; + } else if (family == AF_INET6) { + method = NM_SETTING_IP6_CONFIG_METHOD_MANUAL; + } else { + g_return_val_if_reached(FALSE); + } + g_object_set(s_ip, + NM_SETTING_IP_CONFIG_METHOD, + method, + NM_SETTING_IP_CONFIG_MAY_FAIL, + FALSE, + NULL); + + if (s_gateway && !nm_utils_ipaddr_is_valid(family, s_gateway)) { + g_set_error(error, + NM_SETTINGS_ERROR, + NM_SETTINGS_ERROR_INVALID_CONNECTION, + "iBFT: invalid IP gateway '%s'.", + s_gateway); + return FALSE; + } + + if (s_dns1 && !nm_utils_ipaddr_is_valid(family, s_dns1)) { + g_set_error(error, + NM_SETTINGS_ERROR, + NM_SETTINGS_ERROR_INVALID_CONNECTION, + "iBFT: invalid DNS1 address '%s'.", + s_dns1); + return FALSE; + } + + if (s_dns2 && !nm_utils_ipaddr_is_valid(family, s_dns2)) { + g_set_error(error, + NM_SETTINGS_ERROR, + NM_SETTINGS_ERROR_INVALID_CONNECTION, + "iBFT: invalid DNS2 address '%s'.", + s_dns2); + return FALSE; + } + + if (s_ipaddr) { + prefix = _nm_utils_ascii_str_to_int64(s_prefix, 10, 0, 128, -1); + if (prefix == -1) { + g_set_error(error, + NM_SETTINGS_ERROR, + NM_SETTINGS_ERROR_INVALID_CONNECTION, + "iBFT: invalid IP prefix '%s'.", + s_prefix); + return FALSE; + } + + addr = nm_ip_address_new(family, s_ipaddr, prefix, error); + if (!addr) { + g_prefix_error(error, "iBFT: "); + return FALSE; + } + + nm_setting_ip_config_add_address(s_ip, addr); + nm_ip_address_unref(addr); + + g_object_set(s_ip, NM_SETTING_IP_CONFIG_GATEWAY, s_gateway, NULL); + } + + if (s_dns1) + nm_setting_ip_config_add_dns(s_ip, s_dns1); + if (s_dns2) + nm_setting_ip_config_add_dns(s_ip, s_dns2); + + return TRUE; } static gboolean -connection_setting_add (GHashTable *nic, - NMConnection *connection, - const char *type, - const char *prefix, - GError **error) +connection_setting_add(GHashTable * nic, + NMConnection *connection, + const char * type, + const char * prefix, + GError ** error) { - NMSetting *s_con; - char *id, *uuid; - const char *s_index, *s_hwaddr, *s_ipaddr, *s_vlanid; - - s_index = (const char *)g_hash_table_lookup (nic, "index"); - s_hwaddr = (const char *)g_hash_table_lookup (nic, "mac"); - s_ipaddr = (const char *)g_hash_table_lookup (nic, "ip-addr"); - s_vlanid = (const char *)g_hash_table_lookup (nic, "vlan"); - - if (!s_hwaddr) { - g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, - "iBFT: missing MAC address"); - return FALSE; - } - - id = g_strdup_printf ("iBFT%s%s Connection%s%s", - prefix ? " " : "", - prefix ? prefix : "", - s_index ? " " : "", - s_index ? s_index : ""); - - uuid = _nm_utils_uuid_generate_from_strings ("ibft", - s_hwaddr, - s_vlanid ? "V" : "v", - s_vlanid ? s_vlanid : "", - s_ipaddr ? "A" : "DHCP", - s_ipaddr ? s_ipaddr : "", - NULL); - - s_con = (NMSetting *) nm_connection_get_setting_connection (connection); - if (!s_con) { - s_con = nm_setting_connection_new (); - nm_connection_add_setting (connection, s_con); - } - - g_object_set (s_con, - NM_SETTING_CONNECTION_TYPE, type, - NM_SETTING_CONNECTION_UUID, uuid, - NM_SETTING_CONNECTION_ID, id, - NM_SETTING_CONNECTION_INTERFACE_NAME, NULL, - NULL); - - g_free (uuid); - g_free (id); - - return TRUE; + NMSetting * s_con; + char * id, *uuid; + const char *s_index, *s_hwaddr, *s_ipaddr, *s_vlanid; + + s_index = (const char *) g_hash_table_lookup(nic, "index"); + s_hwaddr = (const char *) g_hash_table_lookup(nic, "mac"); + s_ipaddr = (const char *) g_hash_table_lookup(nic, "ip-addr"); + s_vlanid = (const char *) g_hash_table_lookup(nic, "vlan"); + + if (!s_hwaddr) { + g_set_error_literal(error, + NM_SETTINGS_ERROR, + NM_SETTINGS_ERROR_INVALID_CONNECTION, + "iBFT: missing MAC address"); + return FALSE; + } + + id = g_strdup_printf("iBFT%s%s Connection%s%s", + prefix ? " " : "", + prefix ? prefix : "", + s_index ? " " : "", + s_index ? s_index : ""); + + uuid = _nm_utils_uuid_generate_from_strings("ibft", + s_hwaddr, + s_vlanid ? "V" : "v", + s_vlanid ? s_vlanid : "", + s_ipaddr ? "A" : "DHCP", + s_ipaddr ? s_ipaddr : "", + NULL); + + s_con = (NMSetting *) nm_connection_get_setting_connection(connection); + if (!s_con) { + s_con = nm_setting_connection_new(); + nm_connection_add_setting(connection, s_con); + } + + g_object_set(s_con, + NM_SETTING_CONNECTION_TYPE, + type, + NM_SETTING_CONNECTION_UUID, + uuid, + NM_SETTING_CONNECTION_ID, + id, + NM_SETTING_CONNECTION_INTERFACE_NAME, + NULL, + NULL); + + g_free(uuid); + g_free(id); + + return TRUE; } static gboolean -is_ibft_vlan_device (GHashTable *nic) +is_ibft_vlan_device(GHashTable *nic) { - const char *s_vlan_id; + const char *s_vlan_id; - g_assert (nic); + g_assert(nic); - s_vlan_id = (const char *)g_hash_table_lookup (nic, "vlan"); + s_vlan_id = (const char *) g_hash_table_lookup(nic, "vlan"); - if (s_vlan_id) { - /* VLAN 0 is normally a valid VLAN ID, but in the iBFT case it - * means "no VLAN". - */ - if (_nm_utils_ascii_str_to_int64 (s_vlan_id, 10, 1, 4095, -1) != -1) - return TRUE; - } + if (s_vlan_id) { + /* VLAN 0 is normally a valid VLAN ID, but in the iBFT case it + * means "no VLAN". + */ + if (_nm_utils_ascii_str_to_int64(s_vlan_id, 10, 1, 4095, -1) != -1) + return TRUE; + } - return FALSE; + return FALSE; } static gboolean -vlan_setting_add_from_block (GHashTable *nic, - NMConnection *connection, - GError **error) +vlan_setting_add_from_block(GHashTable *nic, NMConnection *connection, GError **error) { - NMSetting *s_vlan = NULL; - const char *vlan_id_str = NULL; - gint64 vlan_id = -1; - - g_assert (nic); - g_assert (connection); - - /* This won't fail since this function shouldn't be called unless the - * iBFT VLAN ID exists and is > 0. - */ - vlan_id_str = (const char *)g_hash_table_lookup (nic, "vlan"); - g_assert (vlan_id_str); - - /* VLAN 0 is normally a valid VLAN ID, but in the iBFT case it means "no VLAN" */ - vlan_id = _nm_utils_ascii_str_to_int64 (vlan_id_str, 10, 1, 4095, -1); - if (vlan_id == -1) { - g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, - "Invalid VLAN_ID '%s'", vlan_id_str); - return FALSE; - } - - s_vlan = (NMSetting *) nm_connection_get_setting_vlan (connection); - if (!s_vlan) { - s_vlan = nm_setting_vlan_new (); - nm_connection_add_setting (connection, s_vlan); - } - - g_object_set (s_vlan, NM_SETTING_VLAN_ID, (guint32) vlan_id, NULL); - - return TRUE; + NMSetting * s_vlan = NULL; + const char *vlan_id_str = NULL; + gint64 vlan_id = -1; + + g_assert(nic); + g_assert(connection); + + /* This won't fail since this function shouldn't be called unless the + * iBFT VLAN ID exists and is > 0. + */ + vlan_id_str = (const char *) g_hash_table_lookup(nic, "vlan"); + g_assert(vlan_id_str); + + /* VLAN 0 is normally a valid VLAN ID, but in the iBFT case it means "no VLAN" */ + vlan_id = _nm_utils_ascii_str_to_int64(vlan_id_str, 10, 1, 4095, -1); + if (vlan_id == -1) { + g_set_error(error, + NM_SETTINGS_ERROR, + NM_SETTINGS_ERROR_INVALID_CONNECTION, + "Invalid VLAN_ID '%s'", + vlan_id_str); + return FALSE; + } + + s_vlan = (NMSetting *) nm_connection_get_setting_vlan(connection); + if (!s_vlan) { + s_vlan = nm_setting_vlan_new(); + nm_connection_add_setting(connection, s_vlan); + } + + g_object_set(s_vlan, NM_SETTING_VLAN_ID, (guint32) vlan_id, NULL); + + return TRUE; } static gboolean -wired_setting_add_from_block (GHashTable *nic, - NMConnection *connection, - GError **error) +wired_setting_add_from_block(GHashTable *nic, NMConnection *connection, GError **error) { - NMSetting *s_wired = NULL; - const char *hwaddr = NULL; - - g_assert (nic); - g_assert (connection); - - - hwaddr = (const char *)g_hash_table_lookup (nic, "mac"); - if (!hwaddr) { - g_set_error_literal (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, - "iBFT: missing MAC address"); - return FALSE; - } - - if (!nm_utils_hwaddr_valid (hwaddr, ETH_ALEN)) { - g_set_error (error, NM_SETTINGS_ERROR, NM_SETTINGS_ERROR_INVALID_CONNECTION, - "iBFT: invalid MAC address '%s'.", hwaddr); - return FALSE; - } - - s_wired = (NMSetting *) nm_connection_get_setting_wired (connection); - if (!s_wired) { - s_wired = nm_setting_wired_new (); - nm_connection_add_setting (connection, s_wired); - } - - g_object_set (s_wired, NM_SETTING_WIRED_MAC_ADDRESS, hwaddr, NULL); - - return TRUE; + NMSetting * s_wired = NULL; + const char *hwaddr = NULL; + + g_assert(nic); + g_assert(connection); + + hwaddr = (const char *) g_hash_table_lookup(nic, "mac"); + if (!hwaddr) { + g_set_error_literal(error, + NM_SETTINGS_ERROR, + NM_SETTINGS_ERROR_INVALID_CONNECTION, + "iBFT: missing MAC address"); + return FALSE; + } + + if (!nm_utils_hwaddr_valid(hwaddr, ETH_ALEN)) { + g_set_error(error, + NM_SETTINGS_ERROR, + NM_SETTINGS_ERROR_INVALID_CONNECTION, + "iBFT: invalid MAC address '%s'.", + hwaddr); + return FALSE; + } + + s_wired = (NMSetting *) nm_connection_get_setting_wired(connection); + if (!s_wired) { + s_wired = nm_setting_wired_new(); + nm_connection_add_setting(connection, s_wired); + } + + g_object_set(s_wired, NM_SETTING_WIRED_MAC_ADDRESS, hwaddr, NULL); + + return TRUE; } gboolean -nmi_ibft_update_connection_from_nic (NMConnection *connection, GHashTable *nic, GError **error) +nmi_ibft_update_connection_from_nic(NMConnection *connection, GHashTable *nic, GError **error) { - gboolean is_vlan = FALSE; + gboolean is_vlan = FALSE; - g_assert (nic); + g_assert(nic); - is_vlan = is_ibft_vlan_device (nic); - if (is_vlan && !vlan_setting_add_from_block (nic, connection, error)) - return FALSE; + is_vlan = is_ibft_vlan_device(nic); + if (is_vlan && !vlan_setting_add_from_block(nic, connection, error)) + return FALSE; - /* Always have a wired setting; for VLAN it defines the parent */ - if (!wired_setting_add_from_block (nic, connection, error)) - return FALSE; + /* Always have a wired setting; for VLAN it defines the parent */ + if (!wired_setting_add_from_block(nic, connection, error)) + return FALSE; - if (!ip_setting_add_from_block (nic, connection, error)) - return FALSE; + if (!ip_setting_add_from_block(nic, connection, error)) + return FALSE; - if (!connection_setting_add (nic, - connection, - is_vlan ? NM_SETTING_VLAN_SETTING_NAME : NM_SETTING_WIRED_SETTING_NAME, - is_vlan ? "VLAN" : NULL, - error)) - return FALSE; + if (!connection_setting_add(nic, + connection, + is_vlan ? NM_SETTING_VLAN_SETTING_NAME + : NM_SETTING_WIRED_SETTING_NAME, + is_vlan ? "VLAN" : NULL, + error)) + return FALSE; - if (!nm_connection_normalize (connection, NULL, NULL, error)) - return FALSE; + if (!nm_connection_normalize(connection, NULL, NULL, error)) + return FALSE; - return TRUE; + return TRUE; } |