summary refs log tree commit diff
path: root/src/core
diff options
context:
space:
mode:
Diffstat (limited to 'src/core')
-rw-r--r--src/core/devices/nm-device-ethernet.c37
-rw-r--r--src/core/devices/nm-device-ppp.c7
-rw-r--r--src/core/devices/team/nm-device-team.c2
-rw-r--r--src/core/dhcp/nm-dhcp-client.c1
-rw-r--r--src/core/dhcp/nm-dhcp-dhcpcd.c2
-rw-r--r--src/core/nm-connectivity.c47
-rw-r--r--src/core/supplicant/nm-supplicant-manager.c4
7 files changed, 70 insertions, 30 deletions
diff --git a/src/core/devices/nm-device-ethernet.c b/src/core/devices/nm-device-ethernet.c
index 6e18d119..407f8ab8 100644
--- a/src/core/devices/nm-device-ethernet.c
+++ b/src/core/devices/nm-device-ethernet.c
@@ -1160,14 +1160,12 @@ _ppp_mgr_callback(NMPppMgr *ppp_mgr, const NMPppMgrCallbackData *callback_data,
 
     if (device_state < NM_DEVICE_STATE_IP_CONFIG) {
         if (callback_data->data.state >= NM_PPP_MGR_STATE_HAVE_IFINDEX) {
-            gs_free char         *old_name = NULL;
-            gs_free_error GError *error    = NULL;
+            gs_free char *old_name = NULL;
 
-            if (!nm_device_take_over_link(device, callback_data->data.ifindex, &old_name, &error)) {
+            if (!nm_device_set_ip_ifindex(device, callback_data->data.ifindex)) {
                 _LOGW(LOGD_DEVICE | LOGD_PPP,
-                      "could not take control of link %d: %s",
-                      callback_data->data.ifindex,
-                      error->message);
+                      "could not set ip-ifindex %d",
+                      callback_data->data.ifindex);
                 _ppp_mgr_cleanup(self);
                 nm_device_state_changed(device,
                                         NM_DEVICE_STATE_FAILED,
@@ -1892,6 +1890,32 @@ is_available(NMDevice *device, NMDeviceCheckDevAvailableFlags flags)
     return !!nm_device_get_initial_hw_address(device);
 }
 
+static const char *
+get_ip_method_auto(NMDevice *device, int addr_family)
+{
+    NMSettingConnection *s_con;
+
+    s_con = nm_device_get_applied_setting(device, NM_TYPE_SETTING_CONNECTION);
+    g_return_val_if_fail(s_con,
+                         NM_IS_IPv4(addr_family) ? NM_SETTING_IP4_CONFIG_METHOD_AUTO
+                                                 : NM_SETTING_IP6_CONFIG_METHOD_AUTO);
+
+    if (!nm_streq(nm_setting_connection_get_connection_type(s_con),
+                  NM_SETTING_PPPOE_SETTING_NAME)) {
+        return NM_DEVICE_CLASS(nm_device_ethernet_parent_class)
+            ->get_ip_method_auto(device, addr_family);
+    }
+
+    if (NM_IS_IPv4(addr_family)) {
+        /* We cannot do DHCPv4 on a PPP link, instead we get "auto" IP addresses
+         * by pppd. Return "manual" here, which has the suitable effect to a
+         * (zero) manual addresses in addition. */
+        return NM_SETTING_IP6_CONFIG_METHOD_MANUAL;
+    }
+
+    return NM_SETTING_IP6_CONFIG_METHOD_AUTO;
+}
+
 static gboolean
 can_reapply_change(NMDevice   *device,
                    const char *setting_name,
@@ -2047,6 +2071,7 @@ nm_device_ethernet_class_init(NMDeviceEthernetClass *klass)
     device_class->act_stage2_config                              = act_stage2_config;
     device_class->act_stage3_ip_config                           = act_stage3_ip_config;
     device_class->get_configured_mtu                             = get_configured_mtu;
+    device_class->get_ip_method_auto                             = get_ip_method_auto;
     device_class->deactivate                                     = deactivate;
     device_class->get_s390_subchannels                           = get_s390_subchannels;
     device_class->update_connection                              = update_connection;
diff --git a/src/core/devices/nm-device-ppp.c b/src/core/devices/nm-device-ppp.c
index 5ff32401..61e32348 100644
--- a/src/core/devices/nm-device-ppp.c
+++ b/src/core/devices/nm-device-ppp.c
@@ -222,10 +222,9 @@ get_ip_method_auto(NMDevice *device, int addr_family)
         return NM_SETTING_IP6_CONFIG_METHOD_MANUAL;
     }
 
-    /* We can do autoconf6 on an PPP link, but we should already get an IPv6
-     * address from pppd. Use that instead. We however do want to generate our
-     * (own) IPv6 link local address, so return "link-local". */
-    return NM_SETTING_IP6_CONFIG_METHOD_LINK_LOCAL;
+    /* We get a interface identifier via IPV6CP, used to construct a link-local
+     * address. Method auto means autoconf6 as usual.*/
+    return NM_SETTING_IP6_CONFIG_METHOD_AUTO;
 }
 
 static gboolean
diff --git a/src/core/devices/team/nm-device-team.c b/src/core/devices/team/nm-device-team.c
index 16cd2e87..b67c7100 100644
--- a/src/core/devices/team/nm-device-team.c
+++ b/src/core/devices/team/nm-device-team.c
@@ -957,7 +957,7 @@ constructed(GObject *object)
     NMDeviceTeamPrivate   *priv    = NM_DEVICE_TEAM_GET_PRIVATE(device);
     gs_free char          *tmp_str = NULL;
     gs_unref_object GFile *file    = NULL;
-    GError                *error;
+    gs_free_error GError  *error   = NULL;
 
     G_OBJECT_CLASS(nm_device_team_parent_class)->constructed(object);
 
diff --git a/src/core/dhcp/nm-dhcp-client.c b/src/core/dhcp/nm-dhcp-client.c
index ec910389..85e48ff7 100644
--- a/src/core/dhcp/nm-dhcp-client.c
+++ b/src/core/dhcp/nm-dhcp-client.c
@@ -1209,6 +1209,7 @@ dispose(GObject *object)
 
     nm_clear_g_source_inst(&priv->no_lease_timeout_source);
     nm_clear_g_source_inst(&priv->ipv6_lladdr_timeout_source);
+    nm_clear_pointer(&priv->effective_client_id, g_bytes_unref);
 
     G_OBJECT_CLASS(nm_dhcp_client_parent_class)->dispose(object);
 }
diff --git a/src/core/dhcp/nm-dhcp-dhcpcd.c b/src/core/dhcp/nm-dhcp-dhcpcd.c
index 45f96ec9..4b3429ef 100644
--- a/src/core/dhcp/nm-dhcp-dhcpcd.c
+++ b/src/core/dhcp/nm-dhcp-dhcpcd.c
@@ -70,7 +70,7 @@ ip4_start(NMDhcpClient *client, GError **error)
     const NMDhcpClientConfig    *client_config;
     gs_unref_ptrarray GPtrArray *argv = NULL;
     pid_t                        pid;
-    GError                      *local;
+    GError                      *local   = NULL;
     gs_free char                *cmd_str = NULL;
     const char                  *dhcpcd_path;
 
diff --git a/src/core/nm-connectivity.c b/src/core/nm-connectivity.c
index 7199c9a2..c84d8a56 100644
--- a/src/core/nm-connectivity.c
+++ b/src/core/nm-connectivity.c
@@ -15,6 +15,7 @@
 #include <linux/rtnetlink.h>
 
 #include "c-list/src/c-list.h"
+#include "libnm-glib-aux/nm-str-buf.h"
 #include "libnm-platform/nmp-object.h"
 #include "libnm-core-intern/nm-core-internal.h"
 #include "nm-config.h"
@@ -89,7 +90,7 @@ struct _NMConnectivityCheckHandle {
 
     int addr_family;
 
-    guint timeout_id;
+    GSource *timeout_source;
 
     NMConnectivityState completed_state;
     const char         *completed_reason;
@@ -245,7 +246,7 @@ cb_data_complete(NMConnectivityCheckHandle *cb_data,
     nm_clear_g_cancellable(&cb_data->concheck.resolve_cancellable);
 #endif
 
-    nm_clear_g_source(&cb_data->timeout_id);
+    nm_clear_g_source_inst(&cb_data->timeout_source);
 
     _LOG2D("check completed: %s; %s", nm_connectivity_state_to_string(state), log_message);
 
@@ -633,9 +634,9 @@ _idle_cb(gpointer user_data)
                               &cb_data->handles_lst));
     nm_assert(cb_data->completed_reason);
 
-    cb_data->timeout_id = 0;
+    nm_clear_g_source_inst(&cb_data->timeout_source);
     cb_data_complete(cb_data, cb_data->completed_state, cb_data->completed_reason);
-    return G_SOURCE_REMOVE;
+    return G_SOURCE_CONTINUE;
 }
 
 #if WITH_CONCHECK
@@ -662,7 +663,7 @@ do_curl_request(NMConnectivityCheckHandle *cb_data)
     cb_data->concheck.curl_mhandle    = mhandle;
     cb_data->concheck.curl_ehandle    = ehandle;
     cb_data->concheck.request_headers = curl_slist_append(NULL, "Connection: close");
-    cb_data->timeout_id               = g_timeout_add_seconds(20, _timeout_cb, cb_data);
+    cb_data->timeout_source           = nm_g_timeout_add_seconds_source(20, _timeout_cb, cb_data);
 
     curl_multi_setopt(mhandle, CURLMOPT_SOCKETFUNCTION, multi_socket_cb);
     curl_multi_setopt(mhandle, CURLMOPT_SOCKETDATA, cb_data);
@@ -694,6 +695,7 @@ do_curl_request(NMConnectivityCheckHandle *cb_data)
     curl_easy_setopt(ehandle, CURLOPT_INTERFACE, cb_data->ifspec);
     curl_easy_setopt(ehandle, CURLOPT_RESOLVE, cb_data->concheck.hosts);
     curl_easy_setopt(ehandle, CURLOPT_IPRESOLVE, resolve);
+    curl_easy_setopt(ehandle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS);
 
     curl_multi_add_handle(mhandle, ehandle);
 }
@@ -709,7 +711,8 @@ resolve_cb(GObject *object, GAsyncResult *res, gpointer user_data)
     int                        addr_family;
     gsize                      len = 0;
     gsize                      i;
-    gs_free_error GError      *error = NULL;
+    gs_free_error GError      *error        = NULL;
+    nm_auto_str_buf NMStrBuf   strbuf_hosts = NM_STR_BUF_INIT(0, FALSE);
 
     result = g_dbus_connection_call_finish(G_DBUS_CONNECTION(object), res, &error);
     if (g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
@@ -732,25 +735,35 @@ resolve_cb(GObject *object, GAsyncResult *res, gpointer user_data)
     for (i = 0; i < no_addresses; i++) {
         gs_unref_variant GVariant *address = NULL;
         char                       str_addr[NM_UTILS_INET_ADDRSTRLEN];
-        gs_free char              *host_entry = NULL;
         const guchar              *address_buf;
 
         g_variant_get_child(addresses, i, "(ii@ay)", &ifindex, &addr_family, &address);
 
+        if (!NM_IN_SET(addr_family, AF_INET, AF_INET6))
+            continue;
+
         if (cb_data->addr_family != AF_UNSPEC && cb_data->addr_family != addr_family)
             continue;
 
         address_buf = g_variant_get_fixed_array(address, &len, 1);
-        if ((addr_family == AF_INET && len != sizeof(struct in_addr))
-            || (addr_family == AF_INET6 && len != sizeof(struct in6_addr)))
+        if (len != nm_utils_addr_family_to_size(addr_family))
             continue;
 
-        host_entry              = g_strdup_printf("%s:%s:%s",
+        if (strbuf_hosts.len == 0) {
+            nm_str_buf_append_printf(&strbuf_hosts,
+                                     "%s:%s:",
                                      cb_data->concheck.con_config->host,
-                                     cb_data->concheck.con_config->port ?: "80",
-                                     nm_utils_inet_ntop(addr_family, address_buf, str_addr));
-        cb_data->concheck.hosts = curl_slist_append(cb_data->concheck.hosts, host_entry);
-        _LOG2T("adding '%s' to curl resolve list", host_entry);
+                                     cb_data->concheck.con_config->port ?: "80");
+        } else
+            nm_str_buf_append_c(&strbuf_hosts, ',');
+
+        nm_str_buf_append(&strbuf_hosts, nm_utils_inet_ntop(addr_family, address_buf, str_addr));
+    }
+    if (strbuf_hosts.len > 0) {
+        const char *s = nm_str_buf_get_str(&strbuf_hosts);
+
+        cb_data->concheck.hosts = curl_slist_append(NULL, s);
+        _LOG2T("set curl resolve list to '%s'", s);
     }
 
     do_curl_request(cb_data);
@@ -874,7 +887,7 @@ nm_connectivity_check_start(NMConnectivity             *self,
                 _LOG2D("skip connectivity check due to %s", reason);
                 cb_data->completed_state  = state;
                 cb_data->completed_reason = reason;
-                cb_data->timeout_id       = g_idle_add(_idle_cb, cb_data);
+                cb_data->timeout_source   = nm_g_idle_add_source(_idle_cb, cb_data);
                 return cb_data;
             }
         }
@@ -910,7 +923,7 @@ nm_connectivity_check_start(NMConnectivity             *self,
                 _LOG2D("start fake request (fail due to no D-Bus connection)");
                 cb_data->completed_state  = NM_CONNECTIVITY_ERROR;
                 cb_data->completed_reason = "no D-Bus connection";
-                cb_data->timeout_id       = g_idle_add(_idle_cb, cb_data);
+                cb_data->timeout_source   = nm_g_idle_add_source(_idle_cb, cb_data);
                 return cb_data;
             }
 
@@ -953,7 +966,7 @@ nm_connectivity_check_start(NMConnectivity             *self,
         cb_data->completed_reason = "fake result";
     }
     _LOG2D("start fake request (%s)", cb_data->completed_reason);
-    cb_data->timeout_id = g_idle_add(_idle_cb, cb_data);
+    cb_data->timeout_source = nm_g_idle_add_source(_idle_cb, cb_data);
 
     return cb_data;
 }
diff --git a/src/core/supplicant/nm-supplicant-manager.c b/src/core/supplicant/nm-supplicant-manager.c
index 1f8f0105..9de845f0 100644
--- a/src/core/supplicant/nm-supplicant-manager.c
+++ b/src/core/supplicant/nm-supplicant-manager.c
@@ -993,6 +993,7 @@ _dbus_get_capabilities_cb(GVariant *res, GError *error, gpointer user_data)
           " MESH%c"
           " FAST%c"
           " WFD%c"
+          " SUITEB192%c"
           "",
           NM_SUPPL_CAP_TO_CHAR(priv->capabilities, NM_SUPPL_CAP_TYPE_AP),
           NM_SUPPL_CAP_TO_CHAR(priv->capabilities, NM_SUPPL_CAP_TYPE_PMF),
@@ -1002,7 +1003,8 @@ _dbus_get_capabilities_cb(GVariant *res, GError *error, gpointer user_data)
           NM_SUPPL_CAP_TO_CHAR(priv->capabilities, NM_SUPPL_CAP_TYPE_SHA384),
           NM_SUPPL_CAP_TO_CHAR(priv->capabilities, NM_SUPPL_CAP_TYPE_MESH),
           NM_SUPPL_CAP_TO_CHAR(priv->capabilities, NM_SUPPL_CAP_TYPE_FAST),
-          NM_SUPPL_CAP_TO_CHAR(priv->capabilities, NM_SUPPL_CAP_TYPE_WFD));
+          NM_SUPPL_CAP_TO_CHAR(priv->capabilities, NM_SUPPL_CAP_TYPE_WFD),
+          NM_SUPPL_CAP_TO_CHAR(priv->capabilities, NM_SUPPL_CAP_TYPE_SUITEB192));
 
     nm_assert(g_hash_table_size(priv->supp_ifaces) == 0);
     nm_assert(c_list_is_empty(&priv->supp_lst_head));