2020-12-23 22:21:36 +01:00
|
|
|
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
2019-09-25 13:13:40 +02:00
|
|
|
/*
|
2019-10-01 09:20:35 +02:00
|
|
|
* Copyright (C) 2004 - 2016 Red Hat, Inc.
|
|
|
|
|
* Copyright (C) 2005 - 2008 Novell, Inc.
|
2004-06-24 14:18:37 +00:00
|
|
|
*/
|
|
|
|
|
|
all: fix up multiple-include-guard defines
Previously, src/nm-ip4-config.h, libnm/nm-ip4-config.h, and
libnm-glib/nm-ip4-config.h all used "NM_IP4_CONFIG_H" as an include
guard, which meant that nm-test-utils.h could not tell which of them
was being included (and so, eg, if you tried to include
nm-ip4-config.h in a libnm test, it would fail to compile because
nm-test-utils.h was referring to symbols in src/nm-ip4-config.h).
Fix this by changing the include guards in the non-API-stable parts of
the tree:
- libnm-glib/nm-ip4-config.h remains NM_IP4_CONFIG_H
- libnm/nm-ip4-config.h now uses __NM_IP4_CONFIG_H__
- src/nm-ip4-config.h now uses __NETWORKMANAGER_IP4_CONFIG_H__
And likewise for all other headers.
The two non-"nm"-prefixed headers, libnm/NetworkManager.h and
src/NetworkManagerUtils.h are now __NETWORKMANAGER_H__ and
__NETWORKMANAGER_UTILS_H__ respectively, which, while not entirely
consistent with the general scheme, do still mostly make sense in
isolation.
2014-08-13 14:10:11 -04:00
|
|
|
#ifndef __NETWORKMANAGER_UTILS_H__
|
|
|
|
|
#define __NETWORKMANAGER_UTILS_H__
|
2004-06-24 14:18:37 +00:00
|
|
|
|
2016-03-01 09:56:51 +01:00
|
|
|
#include "nm-core-utils.h"
|
2021-02-18 17:37:47 +01:00
|
|
|
#include "libnm-glib-aux/nm-dedup-multi.h"
|
2019-03-23 15:09:29 +01:00
|
|
|
#include "nm-setting-ip-config.h"
|
2020-07-30 11:02:56 +02:00
|
|
|
#include "nm-setting-ip6-config.h"
|
2021-03-04 11:29:39 +01:00
|
|
|
#include "libnm-platform/nm-platform.h"
|
2019-03-23 15:09:29 +01:00
|
|
|
|
2015-12-07 14:04:45 +01:00
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2018-12-12 17:11:34 +01:00
|
|
|
const char *nm_utils_get_ip_config_method(NMConnection *connection, int addr_family);
|
2020-09-28 16:03:33 +02:00
|
|
|
|
2011-07-01 14:56:07 -05:00
|
|
|
const char *nm_utils_get_shared_wifi_permission(NMConnection *connection);
|
2020-09-28 16:03:33 +02:00
|
|
|
|
2021-08-06 15:17:05 +02:00
|
|
|
void nm_utils_ppp_ip_methods_enabled(NMConnection *connection,
|
2021-11-09 13:28:54 +01:00
|
|
|
gboolean *out_ip4_enabled,
|
|
|
|
|
gboolean *out_ip6_enabled);
|
2021-08-06 15:17:05 +02:00
|
|
|
|
2021-11-09 13:28:54 +01:00
|
|
|
void _nm_utils_complete_generic_with_params(NMPlatform *platform,
|
|
|
|
|
NMConnection *connection,
|
|
|
|
|
const char *ctype,
|
2021-07-02 09:16:33 +02:00
|
|
|
NMConnection *const *existing_connections,
|
2021-11-09 13:28:54 +01:00
|
|
|
const char *preferred_id,
|
|
|
|
|
const char *fallback_id_prefix,
|
|
|
|
|
const char *ifname_prefix,
|
|
|
|
|
const char *ifname,
|
2021-07-02 09:16:33 +02:00
|
|
|
...) G_GNUC_NULL_TERMINATED;
|
|
|
|
|
|
|
|
|
|
#define nm_utils_complete_generic_with_params(platform, \
|
|
|
|
|
connection, \
|
|
|
|
|
ctype, \
|
|
|
|
|
existing_connections, \
|
|
|
|
|
preferred_id, \
|
|
|
|
|
fallback_id_prefix, \
|
|
|
|
|
ifname_prefix, \
|
|
|
|
|
ifname, \
|
|
|
|
|
...) \
|
|
|
|
|
_nm_utils_complete_generic_with_params(platform, \
|
|
|
|
|
connection, \
|
|
|
|
|
ctype, \
|
|
|
|
|
existing_connections, \
|
|
|
|
|
preferred_id, \
|
|
|
|
|
fallback_id_prefix, \
|
|
|
|
|
ifname_prefix, \
|
|
|
|
|
ifname, \
|
|
|
|
|
##__VA_ARGS__, \
|
|
|
|
|
NULL)
|
|
|
|
|
|
|
|
|
|
static inline void
|
2021-11-09 13:28:54 +01:00
|
|
|
nm_utils_complete_generic(NMPlatform *platform,
|
|
|
|
|
NMConnection *connection,
|
|
|
|
|
const char *ctype,
|
2021-07-02 09:16:33 +02:00
|
|
|
NMConnection *const *existing_connections,
|
2021-11-09 13:28:54 +01:00
|
|
|
const char *preferred_id,
|
|
|
|
|
const char *fallback_id_prefix,
|
|
|
|
|
const char *ifname_prefix,
|
|
|
|
|
const char *ifname,
|
2021-07-02 09:16:33 +02:00
|
|
|
gboolean default_enable_ipv6)
|
|
|
|
|
{
|
|
|
|
|
nm_utils_complete_generic_with_params(platform,
|
|
|
|
|
connection,
|
|
|
|
|
ctype,
|
|
|
|
|
existing_connections,
|
|
|
|
|
preferred_id,
|
|
|
|
|
fallback_id_prefix,
|
|
|
|
|
ifname_prefix,
|
|
|
|
|
ifname,
|
|
|
|
|
NM_CONNECTION_NORMALIZE_PARAM_IP6_CONFIG_METHOD,
|
|
|
|
|
default_enable_ipv6
|
|
|
|
|
? NM_SETTING_IP6_CONFIG_METHOD_AUTO
|
|
|
|
|
: NM_SETTING_IP6_CONFIG_METHOD_IGNORE);
|
|
|
|
|
}
|
2020-09-28 16:03:33 +02:00
|
|
|
|
2013-11-15 13:09:12 -06:00
|
|
|
typedef gboolean(NMUtilsMatchFilterFunc)(NMConnection *connection, gpointer user_data);
|
2020-09-28 16:03:33 +02:00
|
|
|
|
2021-11-09 13:28:54 +01:00
|
|
|
NMConnection *nm_utils_match_connection(NMConnection *const *connections,
|
|
|
|
|
NMConnection *original,
|
Revert "core: merge branch 'bg/restart-assume-rh1551958'"
This reverts commit cc1920d71470042c4e0837848da9183526b663d0, reversing
changes made to eb8257dea5802a004af9cccacb30af98440e2172.
This breaks restart, at least for Wi-Fi devices:
#0 0x00007ffff5ee8771 in _g_log_abort (breakpoint=breakpoint@entry=1) at gmessages.c:554
#1 0x00007ffff5ee9a5b in g_logv (log_domain=0x7ffff671a738 "GLib-GIO", log_level=G_LOG_LEVEL_CRITICAL, format=<optimized out>, args=args@entry=0x7fffffffd720) at gmessages.c:1362
#2 0x00007ffff5ee9baf in g_log (log_domain=log_domain@entry=0x7ffff671a738 "GLib-GIO", log_level=log_level@entry=G_LOG_LEVEL_CRITICAL, format=format@entry=0x7ffff5f347ea "%s: assertion '%s' failed") at gmessages.c:1403
#3 0x00007ffff5eea0f9 in g_return_if_fail_warning (log_domain=log_domain@entry=0x7ffff671a738 "GLib-GIO", pretty_function=pretty_function@entry=0x7ffff673fc10 <__func__.25628> "g_dbus_proxy_call_internal", expression=expression@entry=0x7ffff673fb1c "G_IS_DBUS_PROXY (proxy)") at gmessages.c:2702
#4 0x00007ffff66cdc5f in g_dbus_proxy_call_internal (proxy=0x0, method_name=method_name@entry=0x555555810510 "Scan", parameters=0x555555c7a530, flags=flags@entry=G_DBUS_CALL_FLAGS_NONE, timeout_msec=timeout_msec@entry=-1, fd_list=fd_list@entry=0x0, cancellable=0x0, callback=0x55555574cb96 <scan_request_cb>, user_data=0x555555ac2220) at gdbusproxy.c:2664
#5 0x00007ffff66cf686 in g_dbus_proxy_call (proxy=<optimized out>, method_name=method_name@entry=0x555555810510 "Scan", parameters=<optimized out>, flags=flags@entry=G_DBUS_CALL_FLAGS_NONE, timeout_msec=timeout_msec@entry=-1, cancellable=cancellable@entry=0x0, callback=0x55555574cb96 <scan_request_cb>, user_data=0x555555ac2220) at gdbusproxy.c:2970
#6 0x000055555574e026 in nm_supplicant_interface_request_scan (self=0x555555ac2220 [NMSupplicantInterface], ssids=ssids@entry=0x0) at src/supplicant/nm-supplicant-interface.c:1821
#7 0x00007fffe1038276 in request_wireless_scan (self=self@entry=0x555555c6ee60 [NMDeviceWifi], periodic=periodic@entry=0, force_if_scanning=force_if_scanning@entry=0, ssids=<optimized out>, ssids@entry=0x0) at src/devices/wifi/nm-device-wifi.c:1347
#8 0x00007fffe1039011 in device_state_changed (device=0x555555c6ee60 [NMDeviceWifi], new_state=NM_DEVICE_STATE_DISCONNECTED, old_state=<optimized out>, reason=<optimized out>)
at src/devices/wifi/nm-device-wifi.c:2998
#9 0x00007ffff432ed1e in ffi_call_unix64 () at ../src/x86/unix64.S:76
#10 0x00007ffff432e68f in ffi_call (cif=cif@entry=0x7fffffffdc70, fn=fn@entry=0x7fffe1038e1e <device_state_changed>, rvalue=<optimized out>, avalue=avalue@entry=0x7fffffffdb60)
at ../src/x86/ffi64.c:525
#15 0x00007ffff63db66f in <emit signal ??? on instance 0x555555c6ee60 [NMDeviceWifi]> (instance=instance@entry=0x555555c6ee60, signal_id=<optimized out>, detail=detail@entry=0)
at gsignal.c:3447
#11 0x00007ffff63bff39 in g_cclosure_marshal_generic (closure=0x555555c22ea0, return_gvalue=0x0, n_param_values=<optimized out>, param_values=<optimized out>, invocation_hint=<optimized out>, marshal_data=<optimized out>) at gclosure.c:1490
#12 0x00007ffff63bf73d in g_closure_invoke (closure=0x555555c22ea0, return_value=0x0, n_param_values=4, param_values=0x7fffffffdea0, invocation_hint=0x7fffffffde20) at gclosure.c:804
#13 0x00007ffff63d1f30 in signal_emit_unlocked_R (node=node@entry=0x555555c22750, detail=detail@entry=0, instance=instance@entry=0x555555c6ee60, emission_return=emission_return@entry=0x0, instance_and_params=instance_and_params@entry=0x7fffffffdea0) at gsignal.c:3673
#14 0x00007ffff63dad05 in g_signal_emit_valist (instance=0x555555c6ee60, signal_id=<optimized out>, detail=0, var_args=var_args@entry=0x7fffffffe0b0) at gsignal.c:3391
#16 0x00005555556f0f18 in _set_state_full (self=self@entry=0x555555c6ee60 [NMDeviceWifi], state=state@entry=NM_DEVICE_STATE_DISCONNECTED, reason=reason@entry=NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED, quitting=quitting@entry=0) at src/devices/nm-device.c:13268
#17 0x00005555556f1774 in nm_device_state_changed (self=self@entry=0x555555c6ee60 [NMDeviceWifi], state=state@entry=NM_DEVICE_STATE_DISCONNECTED, reason=reason@entry=NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED) at src/devices/nm-device.c:13435
#18 0x00005555555bcf95 in recheck_assume_connection (self=self@entry=0x555555b09140 [NMManager], device=device@entry=0x555555c6ee60 [NMDeviceWifi]) at src/nm-manager.c:2297
#19 0x00005555555bd53e in _device_realize_finish (self=self@entry=0x555555b09140 [NMManager], device=device@entry=0x555555c6ee60 [NMDeviceWifi], plink=plink@entry=0x555555ae43d8)
at src/nm-manager.c:2473
#20 0x00005555555c01d0 in platform_link_added (self=self@entry=0x555555b09140 [NMManager], ifindex=<optimized out>, plink=plink@entry=0x555555ae43d8, guess_assume=<optimized out>, dev_state=<optimized out>) at src/nm-manager.c:2789
#21 0x00005555555c0cec in platform_query_devices (self=self@entry=0x555555b09140 [NMManager]) at src/nm-manager.c:2901
#22 0x00005555555c439e in nm_manager_start (self=0x555555b09140 [NMManager], error=<optimized out>) at src/nm-manager.c:5632
#23 0x000055555558498e in main (argc=<optimized out>, argv=<optimized out>) at src/main.c:413
2018-04-04 14:48:52 +02:00
|
|
|
gboolean indicated,
|
2014-02-25 17:56:06 -06:00
|
|
|
gboolean device_has_carrier,
|
2016-02-01 14:16:30 +01:00
|
|
|
gint64 default_v4_metric,
|
|
|
|
|
gint64 default_v6_metric,
|
2013-11-15 13:09:12 -06:00
|
|
|
NMUtilsMatchFilterFunc match_filter_func,
|
|
|
|
|
gpointer match_filter_data);
|
2020-09-28 16:03:33 +02:00
|
|
|
|
2017-12-13 15:10:11 +01:00
|
|
|
int nm_match_spec_device_by_pllink(const NMPlatformLink *pllink,
|
2021-11-09 13:28:54 +01:00
|
|
|
const char *match_device_type,
|
|
|
|
|
const char *match_dhcp_plugin,
|
|
|
|
|
const GSList *specs,
|
2017-12-13 15:10:11 +01:00
|
|
|
int no_match_value);
|
2018-05-18 13:06:03 +02:00
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2019-03-23 15:09:29 +01:00
|
|
|
NMPlatformRoutingRule *nm_ip_routing_rule_to_platform(const NMIPRoutingRule *rule,
|
|
|
|
|
NMPlatformRoutingRule *out_pl);
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
core: add and use NM_SHUTDOWN_TIMEOUT_MS as duration that we plan for shutdown
nm_ppp_manager_stop() wants to ensure that the pppd process is really
gone. For that it uses nm_utils_kill_child_async() to first send
SIGTERM, and sending SIGKILL after a timeout.
Later, we want to fix shutdown of NetworkManager to iterate the mainloop
during shutdown, so that such operations are still handled. However, we
can only delay shutdown for a certain time. After a timeout (NM_SHUTDOWN_TIMEOUT_MS
plus NM_SHUTDOWN_TIMEOUT_MS_GRACE) we really have to give up and
terminate.
That means, the right amount of time between sending SIGTERM and SIGKILL
is exactly NM_SHUTDOWN_TIMEOUT_MS. Hopefully that is of course
sufficient in the first place. If not, send SIGKILL afterwards, and give
a bit more time (NM_SHUTDOWN_TIMEOUT_MS_GRACE) to reap the child.
And if all this time is still not enough, something is really odd and we
abort waiting, with a warning in the logfile.
Since we don't properly handle shutdown yet, the description above is
not really true. But with this patch, we fix it from point of view of
NMPPPManager.
2018-05-18 14:37:14 +02:00
|
|
|
/* during shutdown, there are two relevant timeouts. One is
|
2022-02-18 13:18:47 +01:00
|
|
|
* NM_SHUTDOWN_TIMEOUT_MAX_MSEC which is plenty of time, that we give for all
|
core: add and use NM_SHUTDOWN_TIMEOUT_MS as duration that we plan for shutdown
nm_ppp_manager_stop() wants to ensure that the pppd process is really
gone. For that it uses nm_utils_kill_child_async() to first send
SIGTERM, and sending SIGKILL after a timeout.
Later, we want to fix shutdown of NetworkManager to iterate the mainloop
during shutdown, so that such operations are still handled. However, we
can only delay shutdown for a certain time. After a timeout (NM_SHUTDOWN_TIMEOUT_MS
plus NM_SHUTDOWN_TIMEOUT_MS_GRACE) we really have to give up and
terminate.
That means, the right amount of time between sending SIGTERM and SIGKILL
is exactly NM_SHUTDOWN_TIMEOUT_MS. Hopefully that is of course
sufficient in the first place. If not, send SIGKILL afterwards, and give
a bit more time (NM_SHUTDOWN_TIMEOUT_MS_GRACE) to reap the child.
And if all this time is still not enough, something is really odd and we
abort waiting, with a warning in the logfile.
Since we don't properly handle shutdown yet, the description above is
not really true. But with this patch, we fix it from point of view of
NMPPPManager.
2018-05-18 14:37:14 +02:00
|
|
|
* actions to complete. Of course, during shutdown components should hurry
|
|
|
|
|
* to cleanup.
|
|
|
|
|
*
|
|
|
|
|
* When we initiate shutdown, we should start killing child processes
|
2022-02-18 13:18:47 +01:00
|
|
|
* with SIGTERM. If they don't complete within NM_SHUTDOWN_TIMEOUT_MAX_MSEC, we send
|
core: add and use NM_SHUTDOWN_TIMEOUT_MS as duration that we plan for shutdown
nm_ppp_manager_stop() wants to ensure that the pppd process is really
gone. For that it uses nm_utils_kill_child_async() to first send
SIGTERM, and sending SIGKILL after a timeout.
Later, we want to fix shutdown of NetworkManager to iterate the mainloop
during shutdown, so that such operations are still handled. However, we
can only delay shutdown for a certain time. After a timeout (NM_SHUTDOWN_TIMEOUT_MS
plus NM_SHUTDOWN_TIMEOUT_MS_GRACE) we really have to give up and
terminate.
That means, the right amount of time between sending SIGTERM and SIGKILL
is exactly NM_SHUTDOWN_TIMEOUT_MS. Hopefully that is of course
sufficient in the first place. If not, send SIGKILL afterwards, and give
a bit more time (NM_SHUTDOWN_TIMEOUT_MS_GRACE) to reap the child.
And if all this time is still not enough, something is really odd and we
abort waiting, with a warning in the logfile.
Since we don't properly handle shutdown yet, the description above is
not really true. But with this patch, we fix it from point of view of
NMPPPManager.
2018-05-18 14:37:14 +02:00
|
|
|
* SIGKILL.
|
|
|
|
|
*
|
2022-02-18 13:18:47 +01:00
|
|
|
* After NM_SHUTDOWN_TIMEOUT_MAX_MSEC, NetworkManager will however not yet terminate right
|
|
|
|
|
* away. It iterates the mainloop for another NM_SHUTDOWN_TIMEOUT_ADDITIONAL_MSEC. This
|
core: add and use NM_SHUTDOWN_TIMEOUT_MS as duration that we plan for shutdown
nm_ppp_manager_stop() wants to ensure that the pppd process is really
gone. For that it uses nm_utils_kill_child_async() to first send
SIGTERM, and sending SIGKILL after a timeout.
Later, we want to fix shutdown of NetworkManager to iterate the mainloop
during shutdown, so that such operations are still handled. However, we
can only delay shutdown for a certain time. After a timeout (NM_SHUTDOWN_TIMEOUT_MS
plus NM_SHUTDOWN_TIMEOUT_MS_GRACE) we really have to give up and
terminate.
That means, the right amount of time between sending SIGTERM and SIGKILL
is exactly NM_SHUTDOWN_TIMEOUT_MS. Hopefully that is of course
sufficient in the first place. If not, send SIGKILL afterwards, and give
a bit more time (NM_SHUTDOWN_TIMEOUT_MS_GRACE) to reap the child.
And if all this time is still not enough, something is really odd and we
abort waiting, with a warning in the logfile.
Since we don't properly handle shutdown yet, the description above is
not really true. But with this patch, we fix it from point of view of
NMPPPManager.
2018-05-18 14:37:14 +02:00
|
|
|
* should give time to reap the child process (after SIGKILL).
|
|
|
|
|
*
|
2018-09-15 07:20:54 -04:00
|
|
|
* So, the maximum time we should wait before sending SIGKILL should be at most
|
2022-02-18 13:18:47 +01:00
|
|
|
* NM_SHUTDOWN_TIMEOUT_MAX_MSEC.
|
core: add and use NM_SHUTDOWN_TIMEOUT_MS as duration that we plan for shutdown
nm_ppp_manager_stop() wants to ensure that the pppd process is really
gone. For that it uses nm_utils_kill_child_async() to first send
SIGTERM, and sending SIGKILL after a timeout.
Later, we want to fix shutdown of NetworkManager to iterate the mainloop
during shutdown, so that such operations are still handled. However, we
can only delay shutdown for a certain time. After a timeout (NM_SHUTDOWN_TIMEOUT_MS
plus NM_SHUTDOWN_TIMEOUT_MS_GRACE) we really have to give up and
terminate.
That means, the right amount of time between sending SIGTERM and SIGKILL
is exactly NM_SHUTDOWN_TIMEOUT_MS. Hopefully that is of course
sufficient in the first place. If not, send SIGKILL afterwards, and give
a bit more time (NM_SHUTDOWN_TIMEOUT_MS_GRACE) to reap the child.
And if all this time is still not enough, something is really odd and we
abort waiting, with a warning in the logfile.
Since we don't properly handle shutdown yet, the description above is
not really true. But with this patch, we fix it from point of view of
NMPPPManager.
2018-05-18 14:37:14 +02:00
|
|
|
*/
|
2022-02-18 15:00:37 +01:00
|
|
|
#define NM_SHUTDOWN_TIMEOUT_MAX_MSEC 5000
|
2022-02-18 13:18:47 +01:00
|
|
|
#define NM_SHUTDOWN_TIMEOUT_ADDITIONAL_MSEC 500
|
core: add and use NM_SHUTDOWN_TIMEOUT_MS as duration that we plan for shutdown
nm_ppp_manager_stop() wants to ensure that the pppd process is really
gone. For that it uses nm_utils_kill_child_async() to first send
SIGTERM, and sending SIGKILL after a timeout.
Later, we want to fix shutdown of NetworkManager to iterate the mainloop
during shutdown, so that such operations are still handled. However, we
can only delay shutdown for a certain time. After a timeout (NM_SHUTDOWN_TIMEOUT_MS
plus NM_SHUTDOWN_TIMEOUT_MS_GRACE) we really have to give up and
terminate.
That means, the right amount of time between sending SIGTERM and SIGKILL
is exactly NM_SHUTDOWN_TIMEOUT_MS. Hopefully that is of course
sufficient in the first place. If not, send SIGKILL afterwards, and give
a bit more time (NM_SHUTDOWN_TIMEOUT_MS_GRACE) to reap the child.
And if all this time is still not enough, something is really odd and we
abort waiting, with a warning in the logfile.
Since we don't properly handle shutdown yet, the description above is
not really true. But with this patch, we fix it from point of view of
NMPPPManager.
2018-05-18 14:37:14 +02:00
|
|
|
|
2022-02-18 13:25:13 +01:00
|
|
|
/**
|
|
|
|
|
* NM_SHUTDOWN_TIMEOUT_1500_MSEC: this is just 1500 msec. The special
|
|
|
|
|
* thing about the define is that you are guaranteed that this is not
|
|
|
|
|
* longer than NM_SHUTDOWN_TIMEOUT_MAX_MSEC.
|
|
|
|
|
* When you perform an async operation, it must either be cancellable
|
|
|
|
|
* (and complete fast) or never take longer than NM_SHUTDOWN_TIMEOUT_MAX_MSEC.
|
|
|
|
|
* The usage of this macro makes that relation to NM_SHUTDOWN_TIMEOUT_MAX_MSEC
|
|
|
|
|
* explicit.
|
|
|
|
|
*/
|
|
|
|
|
#define NM_SHUTDOWN_TIMEOUT_1500_MSEC 1500
|
|
|
|
|
|
2022-02-18 15:00:37 +01:00
|
|
|
/* See NM_SHUTDOWN_TIMEOUT_1500_MSEC. */
|
|
|
|
|
#define NM_SHUTDOWN_TIMEOUT_5000_MSEC 5000
|
|
|
|
|
|
2019-08-23 07:45:41 +02:00
|
|
|
typedef enum {
|
2019-08-31 11:33:15 +02:00
|
|
|
/* There is no watched_obj argument, and the shutdown is delayed until the user
|
|
|
|
|
* explicitly calls unregister on the returned handle. */
|
|
|
|
|
NM_SHUTDOWN_WAIT_TYPE_HANDLE,
|
|
|
|
|
|
2019-08-23 07:45:41 +02:00
|
|
|
/* The watched_obj argument is a GObject, and shutdown is delayed until the object
|
|
|
|
|
* gets destroyed (or unregistered). */
|
|
|
|
|
NM_SHUTDOWN_WAIT_TYPE_OBJECT,
|
|
|
|
|
|
|
|
|
|
/* The watched_obj argument is a GCancellable, and shutdown is delayed until the object
|
2022-02-18 13:18:47 +01:00
|
|
|
* gets destroyed (or unregistered). Note that after NM_SHUTDOWN_TIMEOUT_MAX_MSEC, the
|
2019-08-23 07:45:41 +02:00
|
|
|
* cancellable will be cancelled to notify listeners about the shutdown. */
|
|
|
|
|
NM_SHUTDOWN_WAIT_TYPE_CANCELLABLE,
|
|
|
|
|
} NMShutdownWaitType;
|
|
|
|
|
|
2018-05-18 13:06:03 +02:00
|
|
|
typedef struct _NMShutdownWaitObjHandle NMShutdownWaitObjHandle;
|
|
|
|
|
|
2019-08-23 07:45:41 +02:00
|
|
|
NMShutdownWaitObjHandle *nm_shutdown_wait_obj_register_full(gpointer watched_obj,
|
|
|
|
|
NMShutdownWaitType wait_type,
|
2021-11-09 13:28:54 +01:00
|
|
|
char *msg_reason,
|
2019-06-20 07:31:29 +02:00
|
|
|
gboolean free_msg_reason);
|
2018-05-18 13:06:03 +02:00
|
|
|
|
2019-08-23 07:45:41 +02:00
|
|
|
static inline NMShutdownWaitObjHandle *
|
|
|
|
|
nm_shutdown_wait_obj_register_object_full(gpointer watched_obj,
|
2021-11-09 13:28:54 +01:00
|
|
|
char *msg_reason,
|
2019-08-23 07:45:41 +02:00
|
|
|
gboolean free_msg_reason)
|
|
|
|
|
{
|
|
|
|
|
return nm_shutdown_wait_obj_register_full(watched_obj,
|
|
|
|
|
NM_SHUTDOWN_WAIT_TYPE_OBJECT,
|
|
|
|
|
msg_reason,
|
|
|
|
|
free_msg_reason);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define nm_shutdown_wait_obj_register_object(watched_obj, msg_reason) \
|
|
|
|
|
nm_shutdown_wait_obj_register_object_full((watched_obj), ("" msg_reason ""), FALSE)
|
|
|
|
|
|
2019-08-31 11:33:15 +02:00
|
|
|
static inline NMShutdownWaitObjHandle *
|
|
|
|
|
nm_shutdown_wait_obj_register_handle_full(char *msg_reason, gboolean free_msg_reason)
|
|
|
|
|
{
|
|
|
|
|
return nm_shutdown_wait_obj_register_full(NULL,
|
|
|
|
|
NM_SHUTDOWN_WAIT_TYPE_HANDLE,
|
|
|
|
|
msg_reason,
|
|
|
|
|
free_msg_reason);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define nm_shutdown_wait_obj_register_handle(msg_reason) \
|
|
|
|
|
nm_shutdown_wait_obj_register_handle_full(("" msg_reason ""), FALSE)
|
|
|
|
|
|
2019-08-23 07:45:41 +02:00
|
|
|
static inline NMShutdownWaitObjHandle *
|
|
|
|
|
nm_shutdown_wait_obj_register_cancellable_full(GCancellable *watched_obj,
|
2021-11-09 13:28:54 +01:00
|
|
|
char *msg_reason,
|
2019-08-23 07:45:41 +02:00
|
|
|
gboolean free_msg_reason)
|
|
|
|
|
{
|
|
|
|
|
return nm_shutdown_wait_obj_register_full(watched_obj,
|
|
|
|
|
NM_SHUTDOWN_WAIT_TYPE_CANCELLABLE,
|
|
|
|
|
msg_reason,
|
|
|
|
|
free_msg_reason);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#define nm_shutdown_wait_obj_register_cancellable(watched_obj, msg_reason) \
|
|
|
|
|
nm_shutdown_wait_obj_register_cancellable_full((watched_obj), ("" msg_reason ""), FALSE)
|
2018-05-18 13:06:03 +02:00
|
|
|
|
|
|
|
|
void nm_shutdown_wait_obj_unregister(NMShutdownWaitObjHandle *handle);
|
|
|
|
|
|
2016-03-01 09:56:51 +01:00
|
|
|
/*****************************************************************************/
|
2015-08-06 10:29:29 +02:00
|
|
|
|
2018-10-19 10:21:53 +02:00
|
|
|
const char *nm_utils_file_is_in_path(const char *abs_filename, const char *abs_path);
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2020-05-13 13:57:35 +02:00
|
|
|
GPtrArray *
|
|
|
|
|
nm_utils_qdiscs_from_tc_setting(NMPlatform *platform, NMSettingTCConfig *s_tc, int ip_ifindex);
|
|
|
|
|
GPtrArray *
|
|
|
|
|
nm_utils_tfilters_from_tc_setting(NMPlatform *platform, NMSettingTCConfig *s_tc, int ip_ifindex);
|
2020-09-28 16:03:33 +02:00
|
|
|
|
2020-07-22 10:33:16 +02:00
|
|
|
void nm_utils_ip_route_attribute_to_platform(int addr_family,
|
2021-11-09 13:28:54 +01:00
|
|
|
NMIPRoute *s_route,
|
2020-07-22 10:33:16 +02:00
|
|
|
NMPlatformIPRoute *r,
|
2021-08-06 15:17:05 +02:00
|
|
|
gint64 route_table);
|
2020-09-28 16:03:33 +02:00
|
|
|
|
2020-07-30 13:24:48 +02:00
|
|
|
void nm_utils_ip_addresses_to_dbus(int addr_family,
|
|
|
|
|
const NMDedupMultiHeadEntry *head_entry,
|
2021-11-09 13:28:54 +01:00
|
|
|
const NMPObject *best_default_route,
|
|
|
|
|
GVariant **out_address_data,
|
|
|
|
|
GVariant **out_addresses);
|
2020-09-28 16:03:33 +02:00
|
|
|
|
2020-07-30 13:24:48 +02:00
|
|
|
void nm_utils_ip_routes_to_dbus(int addr_family,
|
|
|
|
|
const NMDedupMultiHeadEntry *head_entry,
|
2021-11-09 13:28:54 +01:00
|
|
|
GVariant **out_route_data,
|
|
|
|
|
GVariant **out_routes);
|
2020-07-30 11:02:56 +02:00
|
|
|
|
2020-09-10 13:58:43 +02:00
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
|
|
|
|
/* For now, all we track about a DHCP lease is the GHashTable with
|
|
|
|
|
* the options.
|
|
|
|
|
*
|
|
|
|
|
* We don't add a separate type for that, but we also don't want to use
|
|
|
|
|
* GHashTable directly (because most importantly leases should be immutable
|
|
|
|
|
* and passing a GHashTable pointer around neither makes it clear that
|
|
|
|
|
* this is a lease nor that it's immutable.
|
|
|
|
|
*
|
|
|
|
|
* Instead, add a simple opaque pointer and accessors that cast to a GHashTable.
|
|
|
|
|
*
|
|
|
|
|
* It has no overhead at run time, but gives some rudimentary type safety. */
|
|
|
|
|
|
|
|
|
|
typedef struct _NMDhcpLease NMDhcpLease;
|
|
|
|
|
|
|
|
|
|
static inline NMDhcpLease *
|
|
|
|
|
nm_dhcp_lease_new_from_options(GHashTable *options_take)
|
|
|
|
|
{
|
|
|
|
|
/* a NMDhcpLease is really just a GHashTable. But it's also supposed to be *immutable*.
|
|
|
|
|
*
|
|
|
|
|
* Hence, the API here takes over ownership of the reference to @options_take, that
|
|
|
|
|
* is to emphasize that we acquire ownership of the hash, and it should not be modified
|
|
|
|
|
* anymore. */
|
|
|
|
|
return (NMDhcpLease *) options_take;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline GHashTable *
|
|
|
|
|
nm_dhcp_lease_get_options(NMDhcpLease *lease)
|
|
|
|
|
{
|
|
|
|
|
return (GHashTable *) lease;
|
|
|
|
|
}
|
|
|
|
|
|
2021-05-17 14:37:19 +02:00
|
|
|
static inline NMDhcpLease *
|
2020-09-10 13:58:43 +02:00
|
|
|
nm_dhcp_lease_ref(NMDhcpLease *lease)
|
|
|
|
|
{
|
|
|
|
|
if (lease)
|
|
|
|
|
g_hash_table_ref((GHashTable *) lease);
|
2021-05-17 14:37:19 +02:00
|
|
|
return lease;
|
2020-09-10 13:58:43 +02:00
|
|
|
}
|
|
|
|
|
|
2021-05-17 14:37:19 +02:00
|
|
|
static inline NMDhcpLease *
|
2020-09-10 13:58:43 +02:00
|
|
|
nm_dhcp_lease_unref(NMDhcpLease *lease)
|
|
|
|
|
{
|
|
|
|
|
if (lease)
|
|
|
|
|
g_hash_table_unref((GHashTable *) lease);
|
2021-05-17 14:37:19 +02:00
|
|
|
return NULL;
|
2020-09-10 13:58:43 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline const char *
|
|
|
|
|
nm_dhcp_lease_lookup_option(NMDhcpLease *lease, const char *option)
|
|
|
|
|
{
|
|
|
|
|
nm_assert(option);
|
|
|
|
|
|
|
|
|
|
return nm_g_hash_table_lookup((GHashTable *) lease, option);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
NM_AUTO_DEFINE_FCN(NMDhcpLease *, _nm_auto_unref_dhcplease, nm_dhcp_lease_unref);
|
|
|
|
|
#define nm_auto_unref_dhcplease nm_auto(_nm_auto_unref_dhcplease)
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2021-08-06 15:17:05 +02:00
|
|
|
NMSetting *nm_utils_platform_capture_ip_setting(NMPlatform *platform,
|
|
|
|
|
int addr_family,
|
|
|
|
|
int ifindex,
|
|
|
|
|
gboolean maybe_ipv6_disabled);
|
|
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
2021-03-04 07:54:57 +01:00
|
|
|
void nm_platform_setup(NMPlatform *instance);
|
|
|
|
|
NMPlatform *nm_platform_get(void);
|
|
|
|
|
|
|
|
|
|
#define NM_PLATFORM_GET (nm_platform_get())
|
|
|
|
|
|
|
|
|
|
void nm_linux_platform_setup(void);
|
2021-09-17 17:48:35 +02:00
|
|
|
void nm_linux_platform_setup_with_tc_cache(void);
|
2021-03-04 07:54:57 +01:00
|
|
|
|
|
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
all: fix up multiple-include-guard defines
Previously, src/nm-ip4-config.h, libnm/nm-ip4-config.h, and
libnm-glib/nm-ip4-config.h all used "NM_IP4_CONFIG_H" as an include
guard, which meant that nm-test-utils.h could not tell which of them
was being included (and so, eg, if you tried to include
nm-ip4-config.h in a libnm test, it would fail to compile because
nm-test-utils.h was referring to symbols in src/nm-ip4-config.h).
Fix this by changing the include guards in the non-API-stable parts of
the tree:
- libnm-glib/nm-ip4-config.h remains NM_IP4_CONFIG_H
- libnm/nm-ip4-config.h now uses __NM_IP4_CONFIG_H__
- src/nm-ip4-config.h now uses __NETWORKMANAGER_IP4_CONFIG_H__
And likewise for all other headers.
The two non-"nm"-prefixed headers, libnm/NetworkManager.h and
src/NetworkManagerUtils.h are now __NETWORKMANAGER_H__ and
__NETWORKMANAGER_UTILS_H__ respectively, which, while not entirely
consistent with the general scheme, do still mostly make sense in
isolation.
2014-08-13 14:10:11 -04:00
|
|
|
#endif /* __NETWORKMANAGER_UTILS_H__ */
|