diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/devices/nm-device-ethernet.c | 37 | ||||
| -rw-r--r-- | src/core/devices/nm-device-ppp.c | 7 | ||||
| -rw-r--r-- | src/core/devices/team/nm-device-team.c | 2 | ||||
| -rw-r--r-- | src/core/dhcp/nm-dhcp-client.c | 1 | ||||
| -rw-r--r-- | src/core/dhcp/nm-dhcp-dhcpcd.c | 2 | ||||
| -rw-r--r-- | src/core/nm-connectivity.c | 47 | ||||
| -rw-r--r-- | src/core/supplicant/nm-supplicant-manager.c | 4 | ||||
| -rw-r--r-- | src/libnm-client-impl/nm-client.c | 15 | ||||
| -rw-r--r-- | src/libnm-core-public/nm-version-macros.h | 2 | ||||
| -rw-r--r-- | src/libnm-glib-aux/nm-shared-utils.c | 20 | ||||
| -rw-r--r-- | src/libnm-glib-aux/nm-shared-utils.h | 4 | ||||
| -rw-r--r-- | src/n-dhcp4/src/n-dhcp4-c-connection.c | 19 | ||||
| -rw-r--r-- | src/n-dhcp4/src/n-dhcp4-private.h | 1 | ||||
| -rw-r--r-- | src/nm-cloud-setup/nm-http-client.c | 1 | ||||
| -rw-r--r-- | src/nmcli/connections.c | 20 |
15 files changed, 132 insertions, 50 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)); diff --git a/src/libnm-client-impl/nm-client.c b/src/libnm-client-impl/nm-client.c index 2cf12db5..cd2aa730 100644 --- a/src/libnm-client-impl/nm-client.c +++ b/src/libnm-client-impl/nm-client.c @@ -764,7 +764,7 @@ _nm_client_set_property_sync_legacy(NMClient *self, NMClientPrivate *_priv = NM_CLIENT_GET_PRIVATE(self); \ \ nm_assert(g_source_get_context(_source) == _priv->x_context); \ - nm_assert(g_main_context_is_owner(_priv->x_context)); \ + nm_assert(nm_g_main_context_can_acquire(_priv->x_context)); \ } \ } \ } \ @@ -778,7 +778,7 @@ _nm_client_set_property_sync_legacy(NMClient *self, \ nm_assert((g_main_context_get_thread_default() ?: g_main_context_default()) \ == _priv->x_context); \ - nm_assert(g_main_context_is_owner(_priv->x_context)); \ + nm_assert(nm_g_main_context_can_acquire(_priv->x_context)); \ } \ } \ G_STMT_END @@ -6261,7 +6261,6 @@ nm_client_get_capabilities(NMClient *client, gsize *length) NMClientPrivate *priv; g_return_val_if_fail(NM_IS_CLIENT(client), NULL); - g_return_val_if_fail(length, NULL); priv = NM_CLIENT_GET_PRIVATE(client); @@ -7306,9 +7305,9 @@ _init_start_check_complete(NMClient *self) static void _init_start_cancelled_cb(GCancellable *cancellable, gpointer user_data) { - NMClient *self = user_data; - NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE(self); - GError *error; + NMClient *self = user_data; + NMClientPrivate *priv = NM_CLIENT_GET_PRIVATE(self); + GError *error = NULL; nm_assert(NM_IS_CLIENT(self)); nm_assert(priv->init_data); @@ -7328,8 +7327,8 @@ _init_start_cancelled_cb(GCancellable *cancellable, gpointer user_data) static gboolean _init_start_cancel_on_idle_cb(gpointer user_data) { - NMClient *self = user_data; - GError *error; + NMClient *self = user_data; + GError *error = NULL; nm_utils_error_set_cancelled(&error, FALSE, NULL); _init_start_complete(self, error); diff --git a/src/libnm-core-public/nm-version-macros.h b/src/libnm-core-public/nm-version-macros.h index 8cb7ef49..0aff11b9 100644 --- a/src/libnm-core-public/nm-version-macros.h +++ b/src/libnm-core-public/nm-version-macros.h @@ -30,7 +30,7 @@ * Evaluates to the micro version number of NetworkManager which this source * compiled against. */ -#define NM_MICRO_VERSION (2) +#define NM_MICRO_VERSION (4) /** * NM_CHECK_VERSION: diff --git a/src/libnm-glib-aux/nm-shared-utils.c b/src/libnm-glib-aux/nm-shared-utils.c index 6e6fed12..563b7cc2 100644 --- a/src/libnm-glib-aux/nm-shared-utils.c +++ b/src/libnm-glib-aux/nm-shared-utils.c @@ -6680,3 +6680,23 @@ nm_g_main_context_iterate_for_msec(GMainContext *context, guint timeout_msec) while (source) g_main_context_iteration(context, TRUE); } + +/*****************************************************************************/ + +gboolean +nm_g_main_context_can_acquire(GMainContext *context) +{ + /* Fast path. Usually we don't pass contexts between threads + * and operate while iterating the context. Hence, usually we + * already acquired the context. Check that first. */ + if (g_main_context_is_owner(context)) + return TRUE; + + /* Either the context is not owned, or owned by somebody else. Only + * one way to find out. */ + if (!g_main_context_acquire(context)) + return FALSE; + + g_main_context_release(context); + return TRUE; +} diff --git a/src/libnm-glib-aux/nm-shared-utils.h b/src/libnm-glib-aux/nm-shared-utils.h index 54550f27..a953140b 100644 --- a/src/libnm-glib-aux/nm-shared-utils.h +++ b/src/libnm-glib-aux/nm-shared-utils.h @@ -1789,7 +1789,7 @@ nm_g_idle_add_source(GSourceFunc func, gpointer user_data) /* A convenience function to attach a new timeout source to the default GMainContext. * In that sense it's very similar to g_idle_add() except that it returns a * reference to the new source. */ - return nm_g_source_attach(nm_g_idle_source_new(G_PRIORITY_DEFAULT, func, user_data, NULL), + return nm_g_source_attach(nm_g_idle_source_new(G_PRIORITY_DEFAULT_IDLE, func, user_data, NULL), NULL); } @@ -1931,6 +1931,8 @@ nm_g_main_context_iterate_ready(GMainContext *context) void nm_g_main_context_iterate_for_msec(GMainContext *context, guint timeout_msec); +gboolean nm_g_main_context_can_acquire(GMainContext *context); + /*****************************************************************************/ static inline int diff --git a/src/n-dhcp4/src/n-dhcp4-c-connection.c b/src/n-dhcp4/src/n-dhcp4-c-connection.c index 4aba9739..2f660e3b 100644 --- a/src/n-dhcp4/src/n-dhcp4-c-connection.c +++ b/src/n-dhcp4/src/n-dhcp4-c-connection.c @@ -705,6 +705,7 @@ int n_dhcp4_c_connection_select_new(NDhcp4CConnection *connection, message->userdata.start_time = offer->userdata.start_time; message->userdata.base_time = offer->userdata.base_time; message->userdata.client_addr = client.s_addr; + message->userdata.server_id = server.s_addr; n_dhcp4_incoming_get_xid(offer, &xid); n_dhcp4_outgoing_set_xid(message, xid); @@ -1224,6 +1225,24 @@ int n_dhcp4_c_connection_dispatch_io(NDhcp4CConnection *connection, serv_addr, sizeof(serv_addr))); } + if (type == N_DHCP4_MESSAGE_NAK && + connection->request->userdata.server_id != INADDR_ANY) { + struct in_addr server; + + r = n_dhcp4_incoming_query_server_identifier(message, &server); + if (r) + return N_DHCP4_E_AGAIN; + + if (connection->request->userdata.server_id != server.s_addr) { + n_dhcp4_log(connection->log_queue, + LOG_DEBUG, + "discarded NAK with wrong server-id %s", + inet_ntop(AF_INET, &server, + serv_addr, sizeof(serv_addr))); + return N_DHCP4_E_AGAIN; + } + } + switch (type) { case N_DHCP4_MESSAGE_OFFER: case N_DHCP4_MESSAGE_ACK: diff --git a/src/n-dhcp4/src/n-dhcp4-private.h b/src/n-dhcp4/src/n-dhcp4-private.h index db7b24ff..191e946e 100644 --- a/src/n-dhcp4/src/n-dhcp4-private.h +++ b/src/n-dhcp4/src/n-dhcp4-private.h @@ -202,6 +202,7 @@ struct NDhcp4Outgoing { uint8_t type; uint8_t message_type; uint32_t client_addr; + uint32_t server_id; uint64_t start_time; uint64_t base_time; uint64_t send_time; diff --git a/src/nm-cloud-setup/nm-http-client.c b/src/nm-cloud-setup/nm-http-client.c index 2f71cefa..7ef9f38d 100644 --- a/src/nm-cloud-setup/nm-http-client.c +++ b/src/nm-cloud-setup/nm-http-client.c @@ -305,6 +305,7 @@ nm_http_client_get(NMHttpClient *self, curl_easy_setopt(edata->ehandle, CURLOPT_WRITEFUNCTION, _get_writefunction_cb); curl_easy_setopt(edata->ehandle, CURLOPT_WRITEDATA, edata); curl_easy_setopt(edata->ehandle, CURLOPT_PRIVATE, edata); + curl_easy_setopt(edata->ehandle, CURLOPT_PROTOCOLS, CURLPROTO_HTTP | CURLPROTO_HTTPS); if (http_headers) { for (i = 0; http_headers[i]; ++i) { diff --git a/src/nmcli/connections.c b/src/nmcli/connections.c index 559dc7db..025f96a1 100644 --- a/src/nmcli/connections.c +++ b/src/nmcli/connections.c @@ -4211,16 +4211,16 @@ set_option(NmCli *nmc, if (option && option->check_and_set) { return option->check_and_set(nmc, connection, option, value, error); } else if (value || allow_reset) { - set_property(nmc->client, - connection, - setting_name, - property_name, - value, - !value ? NM_META_ACCESSOR_MODIFIER_DEL - : (inf_flags & NM_META_PROPERTY_INF_FLAG_MULTI - ? NM_META_ACCESSOR_MODIFIER_ADD - : NM_META_ACCESSOR_MODIFIER_SET), - error); + return set_property(nmc->client, + connection, + setting_name, + property_name, + value, + !value ? NM_META_ACCESSOR_MODIFIER_DEL + : (inf_flags & NM_META_PROPERTY_INF_FLAG_MULTI + ? NM_META_ACCESSOR_MODIFIER_ADD + : NM_META_ACCESSOR_MODIFIER_SET), + error); } return TRUE; |