diff options
Diffstat (limited to 'src/NetworkManagerUtils.h')
| -rw-r--r-- | src/NetworkManagerUtils.h | 239 |
1 files changed, 161 insertions, 78 deletions
diff --git a/src/NetworkManagerUtils.h b/src/NetworkManagerUtils.h index 38386c3d..e961c785 100644 --- a/src/NetworkManagerUtils.h +++ b/src/NetworkManagerUtils.h @@ -1,4 +1,4 @@ -// SPDX-License-Identifier: GPL-2.0+ +/* SPDX-License-Identifier: GPL-2.0+ */ /* * Copyright (C) 2004 - 2016 Red Hat, Inc. * Copyright (C) 2005 - 2008 Novell, Inc. @@ -8,49 +8,48 @@ #define __NETWORKMANAGER_UTILS_H__ #include "nm-core-utils.h" - +#include "nm-glib-aux/nm-dedup-multi.h" #include "nm-setting-ip-config.h" +#include "nm-setting-ip6-config.h" #include "platform/nm-platform.h" /*****************************************************************************/ -const char *nm_utils_get_ip_config_method (NMConnection *connection, - int addr_family); - -const char *nm_utils_get_shared_wifi_permission (NMConnection *connection); - -void nm_utils_complete_generic (NMPlatform *platform, - NMConnection *connection, - const char *ctype, - NMConnection *const*existing_connections, - const char *preferred_id, - const char *fallback_id_prefix, - const char *ifname_prefix, - const char *ifname, - gboolean default_enable_ipv6); - -typedef gboolean (NMUtilsMatchFilterFunc) (NMConnection *connection, gpointer user_data); - -NMConnection *nm_utils_match_connection (NMConnection *const*connections, - NMConnection *original, - gboolean indicated, - gboolean device_has_carrier, - gint64 default_v4_metric, - gint64 default_v6_metric, - NMUtilsMatchFilterFunc match_filter_func, - gpointer match_filter_data); - -int nm_match_spec_device_by_pllink (const NMPlatformLink *pllink, - const char *match_device_type, - const char *match_dhcp_plugin, - const GSList *specs, - int no_match_value); - +const char *nm_utils_get_ip_config_method(NMConnection *connection, int addr_family); + +const char *nm_utils_get_shared_wifi_permission(NMConnection *connection); + +void nm_utils_complete_generic(NMPlatform * platform, + NMConnection * connection, + const char * ctype, + NMConnection *const *existing_connections, + const char * preferred_id, + const char * fallback_id_prefix, + const char * ifname_prefix, + const char * ifname, + gboolean default_enable_ipv6); + +typedef gboolean(NMUtilsMatchFilterFunc)(NMConnection *connection, gpointer user_data); + +NMConnection *nm_utils_match_connection(NMConnection *const * connections, + NMConnection * original, + gboolean indicated, + gboolean device_has_carrier, + gint64 default_v4_metric, + gint64 default_v6_metric, + NMUtilsMatchFilterFunc match_filter_func, + gpointer match_filter_data); + +int nm_match_spec_device_by_pllink(const NMPlatformLink *pllink, + const char * match_device_type, + const char * match_dhcp_plugin, + const GSList * specs, + int no_match_value); /*****************************************************************************/ -NMPlatformRoutingRule *nm_ip_routing_rule_to_platform (const NMIPRoutingRule *rule, - NMPlatformRoutingRule *out_pl); +NMPlatformRoutingRule *nm_ip_routing_rule_to_platform(const NMIPRoutingRule *rule, + NMPlatformRoutingRule *out_pl); /*****************************************************************************/ @@ -70,75 +69,159 @@ NMPlatformRoutingRule *nm_ip_routing_rule_to_platform (const NMIPRoutingRule *ru * So, the maximum time we should wait before sending SIGKILL should be at most * NM_SHUTDOWN_TIMEOUT_MS. */ -#define NM_SHUTDOWN_TIMEOUT_MS 1500 -#define NM_SHUTDOWN_TIMEOUT_MS_WATCHDOG 500 +#define NM_SHUTDOWN_TIMEOUT_MS 1500 +#define NM_SHUTDOWN_TIMEOUT_MS_WATCHDOG 500 typedef enum { - /* 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, - - /* 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 - * gets destroyed (or unregistered). Note that after NM_SHUTDOWN_TIMEOUT_MS, the - * cancellable will be cancelled to notify listeners about the shutdown. */ - NM_SHUTDOWN_WAIT_TYPE_CANCELLABLE, + /* 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, + + /* 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 + * gets destroyed (or unregistered). Note that after NM_SHUTDOWN_TIMEOUT_MS, the + * cancellable will be cancelled to notify listeners about the shutdown. */ + NM_SHUTDOWN_WAIT_TYPE_CANCELLABLE, } NMShutdownWaitType; typedef struct _NMShutdownWaitObjHandle NMShutdownWaitObjHandle; -NMShutdownWaitObjHandle *nm_shutdown_wait_obj_register_full (gpointer watched_obj, - NMShutdownWaitType wait_type, - char *msg_reason, - gboolean free_msg_reason); +NMShutdownWaitObjHandle *nm_shutdown_wait_obj_register_full(gpointer watched_obj, + NMShutdownWaitType wait_type, + char * msg_reason, + gboolean free_msg_reason); static inline NMShutdownWaitObjHandle * -nm_shutdown_wait_obj_register_object_full (gpointer watched_obj, - char *msg_reason, - gboolean free_msg_reason) +nm_shutdown_wait_obj_register_object_full(gpointer watched_obj, + char * msg_reason, + gboolean free_msg_reason) { - return nm_shutdown_wait_obj_register_full (watched_obj, NM_SHUTDOWN_WAIT_TYPE_OBJECT, msg_reason, 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) +#define nm_shutdown_wait_obj_register_object(watched_obj, msg_reason) \ + nm_shutdown_wait_obj_register_object_full((watched_obj), ("" msg_reason ""), FALSE) static inline NMShutdownWaitObjHandle * -nm_shutdown_wait_obj_register_handle_full (char *msg_reason, - gboolean free_msg_reason) +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); + 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) +#define nm_shutdown_wait_obj_register_handle(msg_reason) \ + nm_shutdown_wait_obj_register_handle_full(("" msg_reason ""), FALSE) static inline NMShutdownWaitObjHandle * -nm_shutdown_wait_obj_register_cancellable_full (GCancellable *watched_obj, - char *msg_reason, - gboolean free_msg_reason) +nm_shutdown_wait_obj_register_cancellable_full(GCancellable *watched_obj, + char * msg_reason, + gboolean free_msg_reason) { - return nm_shutdown_wait_obj_register_full (watched_obj, NM_SHUTDOWN_WAIT_TYPE_CANCELLABLE, msg_reason, 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) +#define nm_shutdown_wait_obj_register_cancellable(watched_obj, msg_reason) \ + nm_shutdown_wait_obj_register_cancellable_full((watched_obj), ("" msg_reason ""), FALSE) + +void nm_shutdown_wait_obj_unregister(NMShutdownWaitObjHandle *handle); + +/*****************************************************************************/ -void nm_shutdown_wait_obj_unregister (NMShutdownWaitObjHandle *handle); +const char *nm_utils_file_is_in_path(const char *abs_filename, const char *abs_path); /*****************************************************************************/ -const char * -nm_utils_file_is_in_path (const char *abs_filename, - const char *abs_path); +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); + +void nm_utils_ip_route_attribute_to_platform(int addr_family, + NMIPRoute * s_route, + NMPlatformIPRoute *r, + guint32 route_table); + +void nm_utils_ip_addresses_to_dbus(int addr_family, + const NMDedupMultiHeadEntry *head_entry, + const NMPObject * best_default_route, + NMSettingIP6ConfigPrivacy ipv6_privacy, + GVariant ** out_address_data, + GVariant ** out_addresses); + +void nm_utils_ip_routes_to_dbus(int addr_family, + const NMDedupMultiHeadEntry *head_entry, + GVariant ** out_route_data, + GVariant ** out_routes); /*****************************************************************************/ -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); +/* 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; +} + +static inline void +nm_dhcp_lease_ref(NMDhcpLease *lease) +{ + if (lease) + g_hash_table_ref((GHashTable *) lease); +} + +static inline void +nm_dhcp_lease_unref(NMDhcpLease *lease) +{ + if (lease) + g_hash_table_unref((GHashTable *) lease); +} + +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) + +/*****************************************************************************/ #endif /* __NETWORKMANAGER_UTILS_H__ */ |