initrd: add iBFT reader

This is loosely based on nms-ibft-reader, but with some significant
changes. Notably, it parses /sys/firmware/ibft directly instead of
iscsiadm output.

iscsiadm is not available on early boot (perhaps it's too large) and
turns out that parsing sysfs directly is easier and more
straightforwared anyways. A win-win situation.

It is not useful alone, it's in a separate commit just for the sake of
easier review.
This commit is contained in:
Lubomir Rintel 2018-05-03 09:13:32 +02:00
parent c263f5355c
commit b544f7243d
198 changed files with 1231 additions and 0 deletions

1
.gitignore vendored
View file

@ -252,6 +252,7 @@ test-*.trs
/src/dhcp/tests/test-dhcp-options
/src/dhcp/tests/test-dhcp-utils
/src/dnsmasq/tests/test-dnsmasq-utils
/src/initrd/tests/test-ibft-reader
/src/nm-iface-helper
/src/ndisc/tests/test-ndisc-fake
/src/ndisc/tests/test-ndisc-linux

View file

@ -1925,6 +1925,250 @@ $(src_nm_iface_helper_OBJECTS): $(libnm_core_lib_h_pub_mkenums)
###############################################################################
noinst_LTLIBRARIES += src/initrd/libnmi-core.la
src_initrd_libnmi_core_la_CPPFLAGS = \
$(src_cppflags)
src_initrd_libnmi_core_la_SOURCES = \
src/initrd/nm-initrd-generator.h \
src/initrd/nmi-ibft-reader.c \
$(NULL)
check_programs += src/initrd/tests/test-ibft-reader
src_initrd_tests_test_ibft_reader_CPPFLAGS = \
-DNETWORKMANAGER_COMPILATION_TEST \
-DTEST_INITRD_DIR=\"$(abs_srcdir)/src/initrd/tests\" \
$(src_cppflags)
src_initrd_tests_test_ibft_reader_LDFLAGS = \
$(CODE_COVERAGE_LDFLAGS) \
$(SANITIZER_EXEC_LDFLAGS)
src_initrd_tests_test_ibft_reader_LDADD = \
libnm-core/libnm-core.la \
src/initrd/libnmi-core.la \
src/libNetworkManagerTest.la \
$(GLIB_LIBS)
EXTRA_DIST += \
src/initrd/tests/sysfs/class/net/eth0/address \
src/initrd/tests/sysfs/class/net/eth2/address \
src/initrd/tests/sysfs/firmware/ibft/ethernet0/prefix-len \
src/initrd/tests/sysfs/firmware/ibft/ethernet0/hostname \
src/initrd/tests/sysfs/firmware/ibft/ethernet0/gateway \
src/initrd/tests/sysfs/firmware/ibft/ethernet0/mac \
src/initrd/tests/sysfs/firmware/ibft/ethernet0/vlan \
src/initrd/tests/sysfs/firmware/ibft/ethernet0/primary-dns \
src/initrd/tests/sysfs/firmware/ibft/ethernet0/dhcp \
src/initrd/tests/sysfs/firmware/ibft/ethernet0/origin \
src/initrd/tests/sysfs/firmware/ibft/ethernet0/secondary-dns \
src/initrd/tests/sysfs/firmware/ibft/ethernet0/ip-addr \
src/initrd/tests/sysfs/firmware/ibft/ethernet0/subnet-mask \
src/initrd/tests/sysfs/firmware/ibft/ethernet0/index \
src/initrd/tests/sysfs/firmware/ibft/ethernet0/flags \
src/initrd/tests/sysfs/firmware/ibft/initiator/isns-server \
src/initrd/tests/sysfs/firmware/ibft/initiator/initiator-name \
src/initrd/tests/sysfs/firmware/ibft/initiator/pri-radius-server \
src/initrd/tests/sysfs/firmware/ibft/initiator/slp-server \
src/initrd/tests/sysfs/firmware/ibft/initiator/sec-radius-server \
src/initrd/tests/sysfs/firmware/ibft/initiator/index \
src/initrd/tests/sysfs/firmware/ibft/initiator/flags \
src/initrd/tests/sysfs/firmware/ibft/target0/nic-assoc \
src/initrd/tests/sysfs/firmware/ibft/target0/ip-addr \
src/initrd/tests/sysfs/firmware/ibft/target0/chap-type \
src/initrd/tests/sysfs/firmware/ibft/target0/index \
src/initrd/tests/sysfs/firmware/ibft/target0/lun \
src/initrd/tests/sysfs/firmware/ibft/target0/flags \
src/initrd/tests/sysfs/firmware/ibft/target0/port \
src/initrd/tests/sysfs/firmware/ibft/target2/target-name \
src/initrd/tests/sysfs/firmware/ibft/target2/nic-assoc \
src/initrd/tests/sysfs/firmware/ibft/target2/ip-addr \
src/initrd/tests/sysfs/firmware/ibft/target2/chap-type \
src/initrd/tests/sysfs/firmware/ibft/target2/index \
src/initrd/tests/sysfs/firmware/ibft/target2/lun \
src/initrd/tests/sysfs/firmware/ibft/target2/flags \
src/initrd/tests/sysfs/firmware/ibft/target2/port \
src/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_table_id \
src/initrd/tests/sysfs/firmware/ibft/acpi_header/oem_id \
src/initrd/tests/sysfs/firmware/ibft/acpi_header/signature \
src/initrd/tests/sysfs/firmware/ibft/ethernet2/prefix-len \
src/initrd/tests/sysfs/firmware/ibft/ethernet2/hostname \
src/initrd/tests/sysfs/firmware/ibft/ethernet2/gateway \
src/initrd/tests/sysfs/firmware/ibft/ethernet2/mac \
src/initrd/tests/sysfs/firmware/ibft/ethernet2/vlan \
src/initrd/tests/sysfs/firmware/ibft/ethernet2/primary-dns \
src/initrd/tests/sysfs/firmware/ibft/ethernet2/dhcp \
src/initrd/tests/sysfs/firmware/ibft/ethernet2/origin \
src/initrd/tests/sysfs/firmware/ibft/ethernet2/secondary-dns \
src/initrd/tests/sysfs/firmware/ibft/ethernet2/ip-addr \
src/initrd/tests/sysfs/firmware/ibft/ethernet2/subnet-mask \
src/initrd/tests/sysfs/firmware/ibft/ethernet2/index \
src/initrd/tests/sysfs/firmware/ibft/ethernet2/flags \
src/initrd/tests/sysfs-bad-dns1/class/net/eth0/address \
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/prefix-len \
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/gateway \
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/mac \
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/vlan \
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/primary-dns \
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/origin \
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/secondary-dns \
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/ip-addr \
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/subnet-mask \
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/ethernet0/index \
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/initiator/initiator-name \
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/target-name \
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/ip-addr \
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/index \
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/lun \
src/initrd/tests/sysfs-bad-dns1/firmware/ibft/target0/port \
src/initrd/tests/sysfs-bad-dns2/class/net/eth0/address \
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/prefix-len \
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/gateway \
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/mac \
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/vlan \
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/primary-dns \
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/origin \
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/secondary-dns \
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/ip-addr \
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/subnet-mask \
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/ethernet0/index \
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/initiator/initiator-name \
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/target-name \
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/ip-addr \
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/index \
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/lun \
src/initrd/tests/sysfs-bad-dns2/firmware/ibft/target0/port \
src/initrd/tests/sysfs-bad-gateway/class/net/eth0/address \
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/prefix-len \
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/gateway \
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/mac \
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/vlan \
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/primary-dns \
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/origin \
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/secondary-dns \
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/ip-addr \
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/subnet-mask \
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/ethernet0/index \
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/initiator/initiator-name \
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/target-name \
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/ip-addr \
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/index \
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/lun \
src/initrd/tests/sysfs-bad-gateway/firmware/ibft/target0/port \
src/initrd/tests/sysfs-bad-ipaddr/class/net/eth0/address \
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/prefix-len \
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/gateway \
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/mac \
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/vlan \
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/primary-dns \
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/origin \
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/secondary-dns \
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/ip-addr \
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/subnet-mask \
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/ethernet0/index \
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/initiator/initiator-name \
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/target-name \
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/ip-addr \
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/index \
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/lun \
src/initrd/tests/sysfs-bad-ipaddr/firmware/ibft/target0/port \
src/initrd/tests/sysfs-dhcp/class/net/eth0/address \
src/initrd/tests/sysfs-dhcp/class/net/eth1/address \
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/gateway \
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/mac \
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/vlan \
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/primary-dns \
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/origin \
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/secondary-dns \
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet0/index \
src/initrd/tests/sysfs-dhcp/firmware/ibft/initiator/initiator-name \
src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/target-name \
src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/ip-addr \
src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/index \
src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/lun \
src/initrd/tests/sysfs-dhcp/firmware/ibft/target0/port \
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/gateway \
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/mac \
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/vlan \
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/primary-dns \
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/origin \
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/secondary-dns \
src/initrd/tests/sysfs-dhcp/firmware/ibft/ethernet1/index \
src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/target-name \
src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/ip-addr \
src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/index \
src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/lun \
src/initrd/tests/sysfs-dhcp/firmware/ibft/target1/port \
src/initrd/tests/sysfs-static/class/net/eth0/address \
src/initrd/tests/sysfs-static/class/net/eth1/address \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/prefix-len \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/gateway \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/mac \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/vlan \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/primary-dns \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/origin \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/secondary-dns \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/ip-addr \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/subnet-mask \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet0/index \
src/initrd/tests/sysfs-static/firmware/ibft/initiator/initiator-name \
src/initrd/tests/sysfs-static/firmware/ibft/target0/target-name \
src/initrd/tests/sysfs-static/firmware/ibft/target0/ip-addr \
src/initrd/tests/sysfs-static/firmware/ibft/target0/index \
src/initrd/tests/sysfs-static/firmware/ibft/target0/lun \
src/initrd/tests/sysfs-static/firmware/ibft/target0/port \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/gateway \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/mac \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/vlan \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/primary-dns \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/origin \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/secondary-dns \
src/initrd/tests/sysfs-static/firmware/ibft/ethernet1/index \
src/initrd/tests/sysfs-static/firmware/ibft/target1/target-name \
src/initrd/tests/sysfs-static/firmware/ibft/target1/ip-addr \
src/initrd/tests/sysfs-static/firmware/ibft/target1/index \
src/initrd/tests/sysfs-static/firmware/ibft/target1/lun \
src/initrd/tests/sysfs-static/firmware/ibft/target1/port \
src/initrd/tests/sysfs-vlan/class/net/eth0/address \
src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/prefix-len \
src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/mac \
src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/vlan \
src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/origin \
src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/ip-addr \
src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/subnet-mask \
src/initrd/tests/sysfs-vlan/firmware/ibft/ethernet0/index \
src/initrd/tests/sysfs-vlan/firmware/ibft/initiator/initiator-name \
src/initrd/tests/sysfs-vlan/firmware/ibft/target0/target-name \
src/initrd/tests/sysfs-vlan/firmware/ibft/target0/ip-addr \
src/initrd/tests/sysfs-vlan/firmware/ibft/target0/index \
src/initrd/tests/sysfs-vlan/firmware/ibft/target0/lun \
src/initrd/tests/sysfs-vlan/firmware/ibft/target0/port \
$(NULL)
check_programs += src/initrd/tests/test-cmdline-reader
src_initrd_tests_test_cmdline_reader_CPPFLAGS = \
-DNETWORKMANAGER_COMPILATION_TEST \
-DTEST_INITRD_DIR=\"$(abs_srcdir)/src/initrd/tests\" \
$(src_cppflags)
src_initrd_tests_test_cmdline_reader_LDFLAGS = \
$(CODE_COVERAGE_LDFLAGS) \
$(SANITIZER_EXEC_LDFLAGS)
src_initrd_tests_test_cmdline_reader_LDADD = \
libnm-core/libnm-core.la \
src/initrd/libnmi-core.la \
src/libNetworkManagerTest.la \
$(GLIB_LIBS)
$(src_initrd_libnmi_core_la_OBJECTS): $(libnm_core_lib_h_pub_mkenums)
$(src_initrd_tests_test_ibft_reader_OBJECTS): $(libnm_core_lib_h_pub_mkenums)
###############################################################################
EXTRA_DIST += \
src/org.freedesktop.NetworkManager.conf \
src/nm-test-utils-core.h \

View file

@ -0,0 +1,45 @@
/* NetworkManager initrd configuration generator
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Copyright (C) 2014, 2018 Red Hat, Inc.
*/
#ifndef __NM_INITRD_GENERATOR_H__
#define __NM_INITRD_GENERATOR_H__
#include "nm-connection.h"
#include "nm-utils.h"
static inline gboolean
guess_ip_address_family (const char *str)
{
if (str == NULL)
return AF_UNSPEC;
else if (strchr (str, '.'))
return AF_INET;
else if (strchr (str, ':'))
return AF_INET6;
else
return AF_UNSPEC;
}
GHashTable *nmi_ibft_read (const char *sysfs_dir);
gboolean nmi_ibft_update_connection_from_nic (NMConnection *connection, GHashTable *nic, GError **error);
GHashTable *nmi_cmdline_reader_parse (const char *sysfs_dir, char **argv);
#endif /* __NM_INITRD_GENERATOR_H__ */

View file

@ -0,0 +1,441 @@
/* NetworkManager initrd configuration generator
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Copyright 2014 - 2018 Red Hat, Inc.
*/
#include "nm-default.h"
#include "nm-initrd-generator.h"
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include <sys/inotify.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include "nm-core-internal.h"
#include "platform/nm-platform.h"
#include "NetworkManagerUtils.h"
/*****************************************************************************/
#define _NMLOG(level, domain, ...) \
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)
{
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)
{
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)
{
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);
}
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_IGNORE, 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 ( (g_strcmp0 (s_origin, "3") == 0 && family == AF_INET)
|| (g_strcmp0 (s_origin, "4") == 0 && family == AF_INET)) {
method = NM_SETTING_IP4_CONFIG_METHOD_AUTO;
} else if (g_strcmp0 (s_origin, "3") == 0 && family == AF_INET6) {
method = NM_SETTING_IP6_CONFIG_METHOD_DHCP;
} else if (g_strcmp0 (s_origin, "4") == 0 && 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_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_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_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)
{
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,
NULL);
g_free (uuid);
g_free (id);
return TRUE;
}
static gboolean
is_ibft_vlan_device (GHashTable *nic)
{
const char *s_vlan_id;
g_assert (nic);
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;
}
return FALSE;
}
static gboolean
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;
}
static gboolean
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;
}
gboolean
nmi_ibft_update_connection_from_nic (NMConnection *connection, GHashTable *nic, GError **error)
{
gboolean is_vlan = FALSE;
g_assert (nic);
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;
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 (!nm_connection_normalize (connection, NULL, NULL, error))
return FALSE;
return TRUE;
}

View file

@ -0,0 +1,22 @@
test_unit = 'test-ibft'
test_ibft_dir = meson.current_source_dir()
cflags = [
'-DTEST_IBFT_DIR="@0@"'.format(test_ibft_dir),
'-DTEST_SCRATCH_DIR="@0@"'.format(test_ibft_dir)
]
exe = executable(
test_unit,
test_unit + '.c',
dependencies: test_nm_dep,
c_args: cflags,
link_with: libnmi_ibft_core
)
test(
'ibft/' + test_unit,
test_script,
args: test_args + [exe.full_path()]
)

View file

@ -0,0 +1 @@
00:33:21:98:b9:f0

View file

@ -0,0 +1 @@
192.168.35.254

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
192.168.32.72

View file

@ -0,0 +1 @@
00:33:21:98:b9:f0

View file

@ -0,0 +1 @@
1

View file

@ -0,0 +1 @@
10000.500.250.1

View file

@ -0,0 +1 @@
10.16.255.3

View file

@ -0,0 +1 @@
255.255.252.0

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
iqn.pjones6

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
10.16.52.16

View file

@ -0,0 +1 @@
00000000

View file

@ -0,0 +1 @@
3260

View file

@ -0,0 +1 @@
iqn.0.2008-11.com.blahblah:iscsi0

View file

@ -0,0 +1 @@
00:33:21:98:b9:f0

View file

@ -0,0 +1 @@
192.168.35.254

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
192.168.32.72

View file

@ -0,0 +1 @@
00:33:21:98:b9:f0

View file

@ -0,0 +1 @@
1

View file

@ -0,0 +1 @@
10.16.255.2

View file

@ -0,0 +1 @@
blah.foo.bar.baz

View file

@ -0,0 +1 @@
255.255.252.0

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
iqn.pjones6

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
10.16.52.16

View file

@ -0,0 +1 @@
00000000

View file

@ -0,0 +1 @@
3260

View file

@ -0,0 +1 @@
iqn.0.2008-11.com.blahblah:iscsi0

View file

@ -0,0 +1 @@
00:33:21:98:b9:f0

View file

@ -0,0 +1 @@
bb.cc.dd.ee

View file

@ -0,0 +1 @@
192.168.32.72

View file

@ -0,0 +1 @@
00:33:21:98:b9:f0

View file

@ -0,0 +1 @@
10.16.255.2

View file

@ -0,0 +1 @@
10.16.255.3

View file

@ -0,0 +1 @@
255.255.252.0

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
iqn.pjones6

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
10.16.52.16

View file

@ -0,0 +1 @@
00000000

View file

@ -0,0 +1 @@
3260

View file

@ -0,0 +1 @@
iqn.0.2008-11.com.blahblah:iscsi0

View file

@ -0,0 +1 @@
00:33:21:98:b9:f0

View file

@ -0,0 +1 @@
192.168.35.254

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
aa.bb.cc.dd

View file

@ -0,0 +1 @@
00:33:21:98:b9:f0

View file

@ -0,0 +1 @@
10.16.255.2

View file

@ -0,0 +1 @@
10.16.255.3

View file

@ -0,0 +1 @@
255.255.252.0

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
iqn.pjones6

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
10.16.52.16

View file

@ -0,0 +1 @@
00000000

View file

@ -0,0 +1 @@
3260

View file

@ -0,0 +1 @@
iqn.0.2008-11.com.blahblah:iscsi0

View file

@ -0,0 +1 @@
00:33:21:98:b9:f0

View file

@ -0,0 +1 @@
00:33:21:98:b9:f1

View file

@ -0,0 +1 @@
10.16.52.254

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
00:33:21:98:b9:f0

View file

@ -0,0 +1 @@
3

View file

@ -0,0 +1 @@
10.16.255.2

View file

@ -0,0 +1 @@
10.16.255.3

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
10.16.52.254

View file

@ -0,0 +1 @@
1

View file

@ -0,0 +1 @@
00:33:21:98:b9:f1

View file

@ -0,0 +1 @@
3

View file

@ -0,0 +1 @@
10.16.255.2

View file

@ -0,0 +1 @@
10.16.255.3

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
iqn.pjones6

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
10.16.52.16

View file

@ -0,0 +1 @@
00000000

View file

@ -0,0 +1 @@
3260

View file

@ -0,0 +1 @@
iqn.0.2008-11.com.blahblah:iscsi0

View file

@ -0,0 +1 @@
1

View file

@ -0,0 +1 @@
10.16.52.16

View file

@ -0,0 +1 @@
00000000

View file

@ -0,0 +1 @@
3260

View file

@ -0,0 +1 @@
iqn.1.2008-11.com.blahblah:iscsi1

Some files were not shown because too many files have changed in this diff Show more