about summary refs log tree commit diff
path: root/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c')
-rw-r--r--src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c214
1 files changed, 135 insertions, 79 deletions
diff --git a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
index 03b347f9..6dd5ef05 100644
--- a/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
+++ b/src/core/settings/plugins/ifcfg-rh/nms-ifcfg-rh-reader.c
@@ -31,6 +31,7 @@
 #include "nm-setting-ethtool.h"
 #include "nm-setting-8021x.h"
 #include "nm-setting-bond.h"
+#include "nm-setting-bond-port.h"
 #include "nm-setting-team.h"
 #include "nm-setting-team-port.h"
 #include "nm-setting-bridge.h"
@@ -474,7 +475,7 @@ make_connection_setting(const char *file,
     if (v) {
         gs_free const char **items = NULL;
 
-        items = nm_utils_strsplit_set(v, " ");
+        items = nm_strsplit_set(v, " ");
         for (iter = items; iter && *iter; iter++) {
             if (!nm_setting_connection_add_permission(s_con, "user", *iter, NULL))
                 PARSE_WARNING("invalid USERS item '%s'", *iter);
@@ -490,7 +491,7 @@ make_connection_setting(const char *file,
     if (v) {
         gs_free const char **items = NULL;
 
-        items = nm_utils_strsplit_set(v, " \t");
+        items = nm_strsplit_set(v, " \t");
         for (iter = items; iter && *iter; iter++) {
             if (!nm_setting_connection_add_secondary(s_con, *iter))
                 PARSE_WARNING("secondary connection UUID '%s' already added", *iter);
@@ -633,6 +634,15 @@ make_connection_setting(const char *file,
         PARSE_WARNING("invalid LLMNR setting");
     g_object_set(s_con, NM_SETTING_CONNECTION_LLMNR, i_val, NULL);
 
+    i_val = NM_SETTING_CONNECTION_DNS_OVER_TLS_DEFAULT;
+    if (!svGetValueEnum(ifcfg,
+                        "DNS_OVER_TLS",
+                        nm_setting_connection_dns_over_tls_get_type(),
+                        &i_val,
+                        NULL))
+        PARSE_WARNING("invalid DNS_OVER_TLS setting");
+    g_object_set(s_con, NM_SETTING_CONNECTION_DNS_OVER_TLS, i_val, NULL);
+
     return NM_SETTING(s_con);
 }
 
@@ -1036,7 +1046,7 @@ parse_route_line(const char *line,
      * Maybe later we want to support some form of quotation here.
      * Which of course, would be incompatible with initscripts.
      */
-    words_free = nm_utils_strsplit_set(line, " \t\n");
+    words_free = nm_strsplit_set(line, " \t\n");
 
     words = words_free ?: NM_PTRARRAY_EMPTY(const char *);
 
@@ -1582,7 +1592,7 @@ parse_dns_options(NMSettingIPConfig *ip_config, const char *value)
     if (!nm_setting_ip_config_has_dns_options(ip_config))
         nm_setting_ip_config_clear_dns_options(ip_config, TRUE);
 
-    options = nm_utils_strsplit_set(value, " ");
+    options = nm_strsplit_set(value, " ");
     if (options) {
         for (item = options; *item; item++) {
             if (!nm_setting_ip_config_add_dns_option(ip_config, *item))
@@ -1974,26 +1984,27 @@ make_ip4_setting(shvarFile *ifcfg,
         /* DNS servers
          * Pick up just IPv4 addresses (IPv6 addresses are taken by make_ip6_setting())
          */
-        for (i = 1; i <= 10; i++) {
+        for (i = 1; i < 10000; i++) {
             char tag[256];
 
             numbered_tag(tag, "DNS", i);
             nm_clear_g_free(&value);
             v = svGetValueStr(ifcfg, tag, &value);
-            if (v) {
-                if (nm_utils_ipaddr_is_valid(AF_INET, v)) {
-                    if (!nm_setting_ip_config_add_dns(s_ip4, v))
-                        PARSE_WARNING("duplicate DNS server %s", tag);
-                } else if (nm_utils_ipaddr_is_valid(AF_INET6, v)) {
-                    /* Ignore IPv6 addresses */
-                } else {
-                    g_set_error(error,
-                                NM_SETTINGS_ERROR,
-                                NM_SETTINGS_ERROR_INVALID_CONNECTION,
-                                "Invalid DNS server address '%s'",
-                                v);
-                    return NULL;
-                }
+            if (!v)
+                break;
+
+            if (nm_utils_ipaddr_is_valid(AF_INET, v)) {
+                if (!nm_setting_ip_config_add_dns(s_ip4, v))
+                    PARSE_WARNING("duplicate DNS server %s", tag);
+            } else if (nm_utils_ipaddr_is_valid(AF_INET6, v)) {
+                /* Ignore IPv6 addresses */
+            } else {
+                g_set_error(error,
+                            NM_SETTINGS_ERROR,
+                            NM_SETTINGS_ERROR_INVALID_CONNECTION,
+                            "Invalid DNS server address '%s'",
+                            v);
+                return NULL;
             }
         }
 
@@ -2003,7 +2014,7 @@ make_ip4_setting(shvarFile *ifcfg,
         if (v) {
             gs_free const char **searches = NULL;
 
-            searches = nm_utils_strsplit_set(v, " ");
+            searches = nm_strsplit_set(v, " ");
             if (searches) {
                 for (item = searches; *item; item++) {
                     if (!nm_setting_ip_config_add_dns_search(s_ip4, *item))
@@ -2063,7 +2074,7 @@ make_ip4_setting(shvarFile *ifcfg,
         if (v) {
             gs_free const char **searches = NULL;
 
-            searches = nm_utils_strsplit_set(v, " ");
+            searches = nm_strsplit_set(v, " ");
             if (searches) {
                 for (item = searches; *item; item++) {
                     if (!nm_setting_ip_config_add_dns_search(s_ip4, *item))
@@ -2249,6 +2260,7 @@ make_ip6_setting(shvarFile *ifcfg, shvarFile *network_ifcfg, gboolean routes_rea
     gboolean                           ip6_privacy   = FALSE, ip6_privacy_prefer_public_ip;
     NMSettingIP6ConfigPrivacy          ip6_privacy_val;
     guint32                            route_table;
+    gboolean                           is_disabled;
 
     s_ip6 = (NMSettingIPConfig *) nm_setting_ip6_config_new();
 
@@ -2375,10 +2387,9 @@ make_ip6_setting(shvarFile *ifcfg, shvarFile *network_ifcfg, gboolean routes_rea
                  NULL);
 
     /* Don't bother to read IP, DNS and routes when IPv6 is disabled */
-    if (NM_IN_STRSET(method,
-                     NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
-                     NM_SETTING_IP6_CONFIG_METHOD_DISABLED))
-        return NM_SETTING(g_steal_pointer(&s_ip6));
+    is_disabled = NM_IN_STRSET(method,
+                               NM_SETTING_IP6_CONFIG_METHOD_IGNORE,
+                               NM_SETTING_IP6_CONFIG_METHOD_DISABLED);
 
     nm_clear_g_free(&value);
     v = svGetValueStr(ifcfg, "DHCPV6_DUID", &value);
@@ -2437,16 +2448,24 @@ make_ip6_setting(shvarFile *ifcfg, shvarFile *network_ifcfg, gboolean routes_rea
                       ipv6addr_secondaries ?: "",
                       NULL);
 
-    list = nm_utils_strsplit_set(value, " ");
-    for (iter = list, i = 0; iter && *iter; iter++, i++) {
-        NMIPAddress *addr = NULL;
+    list = nm_strsplit_set(value, " ");
+    if (list) {
+        if (is_disabled)
+            PARSE_WARNING("ignore IPv6 addresses with method disabled/ignore");
+        else {
+            for (iter = list, i = 0; *iter; iter++, i++) {
+                nm_auto_unref_ip_address NMIPAddress *addr = NULL;
 
-        if (!parse_full_ip6_address(ifcfg, *iter, i, &addr, error))
-            return NULL;
+                if (!parse_full_ip6_address(ifcfg, *iter, i, &addr, is_disabled ? NULL : error)) {
+                    if (is_disabled)
+                        break;
+                    return NULL;
+                }
 
-        if (!nm_setting_ip_config_add_address(s_ip6, addr))
-            PARSE_WARNING("duplicate IP6 address");
-        nm_ip_address_unref(addr);
+                if (!nm_setting_ip_config_add_address(s_ip6, addr))
+                    PARSE_WARNING("duplicate IP6 address");
+            }
+        }
     }
 
     /* Gateway */
@@ -2462,18 +2481,20 @@ make_ip6_setting(shvarFile *ifcfg, shvarFile *network_ifcfg, gboolean routes_rea
         }
         if (v) {
             char *ptr;
+
             if ((ptr = strchr(v, '%')) != NULL)
                 *ptr = '\0'; /* remove %interface prefix if present */
             if (!nm_utils_ipaddr_is_valid(AF_INET6, v)) {
-                g_set_error(error,
-                            NM_SETTINGS_ERROR,
-                            NM_SETTINGS_ERROR_INVALID_CONNECTION,
-                            "Invalid IP6 address '%s'",
-                            v);
-                return NULL;
-            }
-
-            g_object_set(s_ip6, NM_SETTING_IP_CONFIG_GATEWAY, v, NULL);
+                if (!is_disabled) {
+                    g_set_error(error,
+                                NM_SETTINGS_ERROR,
+                                NM_SETTINGS_ERROR_INVALID_CONNECTION,
+                                "Invalid IP6 address '%s'",
+                                v);
+                    return NULL;
+                }
+            } else
+                g_object_set(s_ip6, NM_SETTING_IP_CONFIG_GATEWAY, v, NULL);
         }
     }
 
@@ -2497,23 +2518,27 @@ make_ip6_setting(shvarFile *ifcfg, shvarFile *network_ifcfg, gboolean routes_rea
     /* DNS servers
      * Pick up just IPv6 addresses (IPv4 addresses are taken by make_ip4_setting())
      */
-    for (i = 1; i <= 10; i++) {
+    for (i = 1; i < 10000; i++) {
         char tag[256];
 
         numbered_tag(tag, "DNS", i);
         nm_clear_g_free(&value);
         v = svGetValueStr(ifcfg, tag, &value);
-        if (!v) {
-            /* all done */
+        if (!v)
             break;
-        }
 
         if (nm_utils_ipaddr_is_valid(AF_INET6, v)) {
+            if (is_disabled) {
+                PARSE_WARNING("ignore DNS server addresses with method disabled/ignore");
+                break;
+            }
             if (!nm_setting_ip_config_add_dns(s_ip6, v))
                 PARSE_WARNING("duplicate DNS server %s", tag);
         } else if (nm_utils_ipaddr_is_valid(AF_INET, v)) {
             /* Ignore IPv4 addresses */
         } else {
+            if (is_disabled)
+                continue;
             g_set_error(error,
                         NM_SETTINGS_ERROR,
                         NM_SETTINGS_ERROR_INVALID_CONNECTION,
@@ -2540,11 +2565,15 @@ make_ip6_setting(shvarFile *ifcfg, shvarFile *network_ifcfg, gboolean routes_rea
     if (v) {
         gs_free const char **searches = NULL;
 
-        searches = nm_utils_strsplit_set(v, " ");
+        searches = nm_strsplit_set(v, " ");
         if (searches) {
-            for (iter = searches; *iter; iter++) {
-                if (!nm_setting_ip_config_add_dns_search(s_ip6, *iter))
-                    PARSE_WARNING("duplicate DNS domain '%s'", *iter);
+            if (is_disabled) {
+                PARSE_WARNING("ignore IPV6_DOMAIN with method disabled/ignore");
+            } else {
+                for (iter = searches; *iter; iter++) {
+                    if (!nm_setting_ip_config_add_dns_search(s_ip6, *iter))
+                        PARSE_WARNING("duplicate DNS domain '%s'", *iter);
+                }
             }
         }
     }
@@ -2957,7 +2986,7 @@ read_dcb_percent_array(shvarFile *       ifcfg,
         return TRUE;
     }
 
-    split = nm_utils_strsplit_set(val, ",");
+    split = nm_strsplit_set(val, ",");
     if (NM_PTRARRAY_LEN(split) != 8) {
         PARSE_WARNING("invalid %s percentage list value '%s'", prop, val);
         g_set_error_literal(error,
@@ -3001,6 +3030,7 @@ make_dcb_setting(shvarFile *ifcfg, NMSetting **out_setting, GError **error)
     gs_unref_object NMSettingDcb *s_dcb = NULL;
     gboolean                      dcb_on;
     NMSettingDcbFlags             flags = NM_SETTING_DCB_FLAG_NONE;
+    gs_free char *                val   = NULL;
 
     g_return_val_if_fail(out_setting, FALSE);
     *out_setting = NULL;
@@ -3020,21 +3050,18 @@ make_dcb_setting(shvarFile *ifcfg, NMSetting **out_setting, GError **error)
                       error)) {
         return FALSE;
     }
-    if (nm_setting_dcb_get_app_fcoe_flags(s_dcb) & NM_SETTING_DCB_FLAG_ENABLE) {
-        gs_free char *val = NULL;
 
-        val = svGetValueStr_cp(ifcfg, KEY_DCB_APP_FCOE_MODE);
-        if (val) {
-            if (NM_IN_STRSET(val, NM_SETTING_DCB_FCOE_MODE_FABRIC, NM_SETTING_DCB_FCOE_MODE_VN2VN))
-                g_object_set(G_OBJECT(s_dcb), NM_SETTING_DCB_APP_FCOE_MODE, val, NULL);
-            else {
-                PARSE_WARNING("invalid FCoE mode '%s'", val);
-                g_set_error_literal(error,
-                                    NM_SETTINGS_ERROR,
-                                    NM_SETTINGS_ERROR_INVALID_CONNECTION,
-                                    "invalid FCoE mode");
-                return FALSE;
-            }
+    val = svGetValueStr_cp(ifcfg, KEY_DCB_APP_FCOE_MODE);
+    if (val) {
+        if (NM_IN_STRSET(val, NM_SETTING_DCB_FCOE_MODE_FABRIC, NM_SETTING_DCB_FCOE_MODE_VN2VN))
+            g_object_set(G_OBJECT(s_dcb), NM_SETTING_DCB_APP_FCOE_MODE, val, NULL);
+        else {
+            PARSE_WARNING("invalid FCoE mode '%s'", val);
+            g_set_error_literal(error,
+                                NM_SETTINGS_ERROR,
+                                NM_SETTINGS_ERROR_INVALID_CONNECTION,
+                                "invalid FCoE mode");
+            return FALSE;
         }
     }
 
@@ -3376,7 +3403,7 @@ fill_wpa_ciphers(shvarFile *ifcfg, NMSettingWirelessSecurity *wsec, gboolean gro
     if (!p)
         return TRUE;
 
-    list = nm_utils_strsplit_set(p, " ");
+    list = nm_strsplit_set(p, " ");
     for (iter = list; iter && *iter; iter++, i++) {
         if (!strcmp(*iter, "CCMP")) {
             if (group)
@@ -3612,7 +3639,7 @@ parse_8021x_phase2_auth(shvarFile *     ifcfg,
     }
 
     inner_auth = g_ascii_strdown(v, -1);
-    list       = nm_utils_strsplit_set(inner_auth, " ");
+    list       = nm_strsplit_set(inner_auth, " ");
     for (iter = list; iter && *iter; iter++) {
         if (NM_IN_STRSET(*iter, "pap", "chap", "mschap", "mschapv2", "gtc", "otp", "md5")) {
             if (num_auth == 0) {
@@ -3787,7 +3814,7 @@ eap_fast_reader(const char *    eap_method,
     if (fast_provisioning) {
         gs_free const char **list = NULL;
 
-        list = nm_utils_strsplit_set(fast_provisioning, " \t");
+        list = nm_strsplit_set(fast_provisioning, " \t");
         for (iter = list; iter && *iter; iter++) {
             if (strcmp(*iter, "allow-unauth") == 0)
                 allow_unauth = TRUE;
@@ -3865,7 +3892,7 @@ read_8021x_list_value(shvarFile *     ifcfg,
     if (!v)
         return;
 
-    strv = nm_utils_strsplit_set(v, " \t");
+    strv = nm_strsplit_set(v, " \t");
     if (strv)
         g_object_set(setting, prop_name, strv, NULL);
 }
@@ -3892,7 +3919,7 @@ fill_8021x(shvarFile *ifcfg, const char *file, const char *key_mgmt, gboolean wi
         return NULL;
     }
 
-    list = nm_utils_strsplit_set(v, " ");
+    list = nm_strsplit_set(v, " ");
 
     s_8021x = (NMSetting8021x *) nm_setting_802_1x_new();
 
@@ -4245,7 +4272,7 @@ transform_hwaddr_blacklist(const char *blacklist)
     const char **strv;
     gsize        i, j;
 
-    strv = nm_utils_strsplit_set(blacklist, " \t");
+    strv = nm_strsplit_set(blacklist, " \t");
     if (!strv)
         return NULL;
     for (i = 0, j = 0; strv[j]; j++) {
@@ -4714,7 +4741,7 @@ parse_ethtool_option(const char *             value,
     gs_free const char **words        = NULL;
     NMEthtoolType        ethtool_type = NM_ETHTOOL_TYPE_UNKNOWN;
 
-    words = nm_utils_strsplit_set(value, " \t\n");
+    words = nm_strsplit_set(value, " \t\n");
     if (!words)
         return;
 
@@ -4976,7 +5003,7 @@ parse_ethtool_options(shvarFile *ifcfg, NMConnection *connection)
             gs_free const char **opts = NULL;
             const char *const *  iter;
 
-            opts = nm_utils_strsplit_set(ethtool_opts, ";");
+            opts = nm_strsplit_set(ethtool_opts, ";");
             for (iter = opts; iter && iter[0]; iter++) {
                 /* in case of repeated wol_passwords, parse_ethtool_option()
                  * will do the right thing and clear wol_password before resetting. */
@@ -5084,7 +5111,7 @@ make_wired_setting(shvarFile *ifcfg, const char *file, NMSetting8021x **s_8021x,
                 gs_free const char **chans = NULL;
                 guint32              num_chans;
 
-                chans     = nm_utils_strsplit_set(cvalue, ",");
+                chans     = nm_strsplit_set(cvalue, ",");
                 num_chans = NM_PTRARRAY_LEN(chans);
                 if (num_chans < 2 || num_chans > 3) {
                     PARSE_WARNING("invalid SUBCHANNELS '%s' (%u channels, 2 or 3 expected)",
@@ -5456,7 +5483,7 @@ make_bond_setting(shvarFile *ifcfg, const char *file, GError **error)
         gs_free const char **items = NULL;
         const char *const *  iter;
 
-        items = nm_utils_strsplit_set(v, " ");
+        items = nm_strsplit_set(v, " ");
         for (iter = items; iter && *iter; iter++) {
             gs_free char *key = NULL;
             const char *  val;
@@ -5474,6 +5501,31 @@ make_bond_setting(shvarFile *ifcfg, const char *file, GError **error)
     return (NMSetting *) s_bond;
 }
 
+static NMSetting *
+make_bond_port_setting(shvarFile *ifcfg)
+{
+    NMSetting *   s_port        = NULL;
+    gs_free char *value_to_free = NULL;
+    const char *  value;
+    guint         queue_id;
+
+    g_return_val_if_fail(ifcfg != NULL, FALSE);
+
+    value = svGetValue(ifcfg, "BOND_PORT_QUEUE_ID", &value_to_free);
+    if (value) {
+        s_port = nm_setting_bond_port_new();
+        queue_id =
+            _nm_utils_ascii_str_to_uint64(value, 10, 0, G_MAXUINT16, NM_BOND_PORT_QUEUE_ID_DEF);
+        if (errno != 0) {
+            PARSE_WARNING("Invalid bond port queue_id value '%s'", value);
+            return s_port;
+        }
+        g_object_set(G_OBJECT(s_port), NM_SETTING_BOND_PORT_QUEUE_ID, queue_id, NULL);
+    }
+
+    return s_port;
+}
+
 static NMConnection *
 bond_connection_from_ifcfg(const char *file, shvarFile *ifcfg, GError **error)
 {
@@ -5766,7 +5818,7 @@ handle_bridging_opts(NMSetting *   setting,
     gs_free const char **items = NULL;
     const char *const *  iter;
 
-    items = nm_utils_strsplit_set(value, " ");
+    items = nm_strsplit_set(value, " ");
     for (iter = items; iter && *iter; iter++) {
         gs_free char *key = NULL;
         const char *  val;
@@ -6027,7 +6079,7 @@ parse_prio_map_list(NMSettingVlan *s_vlan, shvarFile *ifcfg, const char *key, NM
     v = svGetValueStr(ifcfg, key, &value);
     if (!v)
         return;
-    list = nm_utils_strsplit_set(v, ",");
+    list = nm_strsplit_set(v, ",");
 
     for (iter = list; iter && *iter; iter++) {
         if (!strchr(*iter, ':'))
@@ -6138,7 +6190,7 @@ make_vlan_setting(shvarFile *ifcfg, const char *file, GError **error)
         gs_free const char **strv = NULL;
         const char *const *  ptr;
 
-        strv = nm_utils_strsplit_set(v, ", ");
+        strv = nm_strsplit_set(v, ", ");
         for (ptr = strv; ptr && *ptr; ptr++) {
             if (nm_streq(*ptr, "GVRP") && gvrp == -1)
                 vlan_flags |= NM_VLAN_FLAG_GVRP;
@@ -6284,7 +6336,7 @@ check_dns_search_domains(shvarFile *ifcfg, NMSetting *s_ip4, NMSetting *s_ip6)
             gs_free const char **searches = NULL;
             const char *const *  item;
 
-            searches = nm_utils_strsplit_set(v, " ");
+            searches = nm_strsplit_set(v, " ");
             if (searches) {
                 for (item = searches; *item; item++) {
                     if (!nm_setting_ip_config_add_dns_search(NM_SETTING_IP_CONFIG(s_ip6), *item))
@@ -6641,6 +6693,10 @@ connection_from_file_full(const char *filename,
     if (setting)
         nm_connection_add_setting(connection, setting);
 
+    setting = make_bond_port_setting(main_ifcfg);
+    if (setting)
+        nm_connection_add_setting(connection, setting);
+
     setting = make_team_port_setting(main_ifcfg);
     if (setting)
         nm_connection_add_setting(connection, setting);