diff options
| author | Michael Biebl <biebl@debian.org> | 2018-05-11 22:08:45 +0200 |
|---|---|---|
| committer | Michael Biebl <biebl@debian.org> | 2018-05-11 22:08:45 +0200 |
| commit | ee9c73a923909e23a649407be77e25235d769e25 (patch) | |
| tree | e21c923621fa278e737da693df9eb60ea31a6067 /src/nm-ip4-config.c | |
| parent | f60117b41d5433be1b4a96d82cd11d0c3dce9b63 (diff) | |
New upstream version 1.10.8 upstream/1.10.8
Diffstat (limited to 'src/nm-ip4-config.c')
| -rw-r--r-- | src/nm-ip4-config.c | 212 |
1 files changed, 56 insertions, 156 deletions
diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index 0a9591d2..15157739 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -36,7 +36,8 @@ #include "platform/nm-platform-utils.h" #include "NetworkManagerUtils.h" #include "nm-core-internal.h" -#include "nm-dbus-object.h" + +#include "introspection/org.freedesktop.NetworkManager.IP4Config.h" /*****************************************************************************/ @@ -292,7 +293,6 @@ typedef struct { int ifindex; NMIPConfigSource mtu_source; gint dns_priority; - NMSettingConnectionMdns mdns; GArray *nameservers; GPtrArray *domains; GPtrArray *searches; @@ -317,15 +317,15 @@ typedef struct { } NMIP4ConfigPrivate; struct _NMIP4Config { - NMDBusObject parent; + NMExportedObject parent; NMIP4ConfigPrivate _priv; }; struct _NMIP4ConfigClass { - NMDBusObjectClass parent; + NMExportedObjectClass parent; }; -G_DEFINE_TYPE (NMIP4Config, nm_ip4_config, NM_TYPE_DBUS_OBJECT) +G_DEFINE_TYPE (NMIP4Config, nm_ip4_config, NM_TYPE_EXPORTED_OBJECT) #define NM_IP4_CONFIG_GET_PRIVATE(self) _NM_GET_PRIVATE(self, NMIP4Config, NM_IS_IP4_CONFIG) @@ -582,24 +582,14 @@ sort_captured_addresses (const CList *lst_a, const CList *lst_b, gconstpointer u } NMIP4Config * -nm_ip4_config_clone (const NMIP4Config *self) -{ - NMIP4Config *copy; - - copy = nm_ip4_config_new (nm_ip4_config_get_multi_idx (self), -1); - nm_ip4_config_replace (copy, self, NULL); - - return copy; -} - -NMIP4Config * -nm_ip4_config_capture (NMDedupMultiIndex *multi_idx, NMPlatform *platform, int ifindex) +nm_ip4_config_capture (NMDedupMultiIndex *multi_idx, NMPlatform *platform, int ifindex, gboolean capture_resolv_conf) { NMIP4Config *self; NMIP4ConfigPrivate *priv; const NMDedupMultiHeadEntry *head_entry; NMDedupMultiIter iter; const NMPObject *plobj = NULL; + gboolean has_addresses = FALSE; nm_assert (ifindex > 0); @@ -631,6 +621,7 @@ nm_ip4_config_capture (NMDedupMultiIndex *multi_idx, NMPlatform *platform, int i nm_dedup_multi_head_entry_sort (head_entry, sort_captured_addresses, NULL); + has_addresses = TRUE; _notify_addresses (self); } @@ -642,6 +633,23 @@ nm_ip4_config_capture (NMDedupMultiIndex *multi_idx, NMPlatform *platform, int i nmp_cache_iter_for_each (&iter, head_entry, &plobj) _add_route (self, plobj, NULL, NULL); + /* If the interface has the default route, and has IPv4 addresses, capture + * nameservers from /etc/resolv.conf. + */ + if ( has_addresses + && priv->best_default_route + && capture_resolv_conf) { + gs_free char *rc_contents = NULL; + + if (g_file_get_contents (_PATH_RESCONF, &rc_contents, NULL, NULL)) { + if (nm_utils_resolve_conf_parse (AF_INET, + rc_contents, + priv->nameservers, + priv->dns_options)) + _notify (self, PROP_NAMESERVERS); + } + } + return self; } @@ -651,6 +659,7 @@ nm_ip4_config_add_dependent_routes (NMIP4Config *self, guint32 route_metric, GPtrArray **out_ip4_dev_route_blacklist) { + const NMIP4ConfigPrivate *priv; GPtrArray *ip4_dev_route_blacklist = NULL; const NMPlatformIP4Address *my_addr; const NMPlatformIP4Route *my_route; @@ -659,6 +668,8 @@ nm_ip4_config_add_dependent_routes (NMIP4Config *self, g_return_if_fail (NM_IS_IP4_CONFIG (self)); + priv = NM_IP4_CONFIG_GET_PRIVATE (self); + ifindex = nm_ip4_config_get_ifindex (self); g_return_if_fail (ifindex > 0); @@ -882,10 +893,10 @@ _nm_ip_config_merge_route_attributes (int addr_family, void nm_ip4_config_merge_setting (NMIP4Config *self, NMSettingIPConfig *setting, - NMSettingConnectionMdns mdns, guint32 route_table, guint32 route_metric) { + NMIP4ConfigPrivate *priv; guint naddresses, nroutes, nnameservers, nsearches; int i, priority; const char *gateway_str; @@ -896,6 +907,8 @@ nm_ip4_config_merge_setting (NMIP4Config *self, g_return_if_fail (NM_IS_SETTING_IP4_CONFIG (setting)); + priv = NM_IP4_CONFIG_GET_PRIVATE (self); + g_object_freeze_notify (G_OBJECT (self)); naddresses = nm_setting_ip_config_get_num_addresses (setting); @@ -933,7 +946,7 @@ nm_ip4_config_merge_setting (NMIP4Config *self, address.preferred = NM_PLATFORM_LIFETIME_PERMANENT; address.addr_source = NM_IP_CONFIG_SOURCE_USER; - label = nm_ip_address_get_attribute (s_addr, NM_IP_ADDRESS_ATTRIBUTE_LABEL); + label = nm_ip_address_get_attribute (s_addr, "label"); if (label) g_strlcpy (address.label, g_variant_get_string (label, NULL), sizeof (address.label)); @@ -999,8 +1012,6 @@ nm_ip4_config_merge_setting (NMIP4Config *self, if (priority) nm_ip4_config_set_dns_priority (self, priority); - nm_ip4_config_mdns_set (self, mdns); - g_object_thaw_notify (G_OBJECT (self)); } @@ -1047,7 +1058,7 @@ nm_ip4_config_create_setting (const NMIP4Config *self) s_addr = nm_ip_address_new_binary (AF_INET, &address->address, address->plen, NULL); if (*address->label) - nm_ip_address_set_attribute (s_addr, NM_IP_ADDRESS_ATTRIBUTE_LABEL, g_variant_new_string (address->label)); + nm_ip_address_set_attribute (s_addr, "label", g_variant_new_string (address->label)); nm_setting_ip_config_add_address (s_ip4, s_addr); nm_ip_address_unref (s_addr); @@ -1216,11 +1227,6 @@ nm_ip4_config_merge (NMIP4Config *dst, if (nm_ip4_config_get_dns_priority (src)) nm_ip4_config_set_dns_priority (dst, nm_ip4_config_get_dns_priority (src)); - /* mdns */ - nm_ip4_config_mdns_set (dst, - NM_MAX (nm_ip4_config_mdns_get (src), - nm_ip4_config_mdns_get (dst))); - g_object_thaw_notify (G_OBJECT (dst)); } @@ -1457,18 +1463,13 @@ nm_ip4_config_subtract (NMIP4Config *dst, if (nm_ip4_config_get_dns_priority (src) == nm_ip4_config_get_dns_priority (dst)) nm_ip4_config_set_dns_priority (dst, 0); - /* mdns */ - if (nm_ip4_config_mdns_get (src) == nm_ip4_config_mdns_get (dst)) - nm_ip4_config_mdns_set (dst, NM_SETTING_CONNECTION_MDNS_DEFAULT); - g_object_thaw_notify (G_OBJECT (dst)); } -static gboolean -_nm_ip4_config_intersect_helper (NMIP4Config *dst, - const NMIP4Config *src, - guint32 default_route_metric_penalty, - gboolean update_dst) +void +nm_ip4_config_intersect (NMIP4Config *dst, + const NMIP4Config *src, + guint32 default_route_metric_penalty) { NMIP4ConfigPrivate *dst_priv; const NMIP4ConfigPrivate *src_priv; @@ -1476,16 +1477,15 @@ _nm_ip4_config_intersect_helper (NMIP4Config *dst, const NMPlatformIP4Address *a; const NMPlatformIP4Route *r; const NMPObject *new_best_default_route; - gboolean changed, result = FALSE; + gboolean changed; - g_return_val_if_fail (src, FALSE); - g_return_val_if_fail (dst, FALSE); + g_return_if_fail (src); + g_return_if_fail (dst); dst_priv = NM_IP4_CONFIG_GET_PRIVATE (dst); src_priv = NM_IP4_CONFIG_GET_PRIVATE (src); - if (update_dst) - g_object_freeze_notify (G_OBJECT (dst)); + g_object_freeze_notify (G_OBJECT (dst)); /* addresses */ changed = FALSE; @@ -1495,18 +1495,13 @@ _nm_ip4_config_intersect_helper (NMIP4Config *dst, NMP_OBJECT_UP_CAST (a))) continue; - if (!update_dst) - return TRUE; - if (nm_dedup_multi_index_remove_entry (dst_priv->multi_idx, ipconf_iter.current) != 1) nm_assert_not_reached (); changed = TRUE; } - if (changed) { + if (changed) _notify_addresses (dst); - result = TRUE; - } /* ignore nameservers */ @@ -1538,9 +1533,6 @@ _nm_ip4_config_intersect_helper (NMIP4Config *dst, continue; } - if (!update_dst) - return TRUE; - if (nm_dedup_multi_index_remove_entry (dst_priv->multi_idx, ipconf_iter.current) != 1) nm_assert_not_reached (); @@ -1550,71 +1542,18 @@ _nm_ip4_config_intersect_helper (NMIP4Config *dst, nm_assert (changed); _notify (dst, PROP_GATEWAY); } - - if (changed) { + if (changed) _notify_routes (dst); - result = TRUE; - } /* ignore domains */ /* ignore dns searches */ /* ignore dns options */ /* ignore NIS */ /* ignore WINS */ - /* ignore mdns */ - if (update_dst) - g_object_thaw_notify (G_OBJECT (dst)); - return result; + g_object_thaw_notify (G_OBJECT (dst)); } -/** - * nm_ip4_config_intersect: - * @dst: a configuration to be updated - * @src: another configuration - * @default_route_metric_penalty: the default route metric penalty - * - * Computes the intersection between @src and @dst and updates @dst in place - * with the result. - */ -void -nm_ip4_config_intersect (NMIP4Config *dst, - const NMIP4Config *src, - guint32 default_route_metric_penalty) -{ - _nm_ip4_config_intersect_helper (dst, src, default_route_metric_penalty, TRUE); -} - -/** - * nm_ip4_config_intersect_alloc: - * @a: a configuration - * @b: another configuration - * @default_route_metric_penalty: the default route metric penalty - * - * Computes the intersection between @a and @b and returns the result in a newly - * allocated configuration. As a special case, if @a and @b are identical (with - * respect to the only properties considered - addresses and routes) the - * functions returns NULL so that one of existing configuration can be reused - * without allocation. - * - * Returns: the intersection between @a and @b, or %NULL if the result is equal - * to @a and @b. - */ -NMIP4Config * -nm_ip4_config_intersect_alloc (const NMIP4Config *a, - const NMIP4Config *b, - guint32 default_route_metric_penalty) -{ - NMIP4Config *a_copy; - - if (_nm_ip4_config_intersect_helper ((NMIP4Config *) a, b, - default_route_metric_penalty, FALSE)) { - a_copy = nm_ip4_config_clone (a); - _nm_ip4_config_intersect_helper (a_copy, b, default_route_metric_penalty, TRUE); - return a_copy; - } else - return NULL; -} /** * nm_ip4_config_replace: @@ -1840,8 +1779,6 @@ nm_ip4_config_replace (NMIP4Config *dst, const NMIP4Config *src, gboolean *relev has_relevant_changes = TRUE; } - dst_priv->mdns = src_priv->mdns; - /* DNS priority */ if (src_priv->dns_priority != dst_priv->dns_priority) { nm_ip4_config_set_dns_priority (dst, src_priv->dns_priority); @@ -1934,7 +1871,7 @@ nm_ip4_config_dump (const NMIP4Config *self, const char *detail) return; } - str = nm_dbus_object_get_path (NM_DBUS_OBJECT (self)); + str = nm_exported_object_get_path (NM_EXPORTED_OBJECT (self)); if (str) g_message (" path: %s", str); @@ -2519,21 +2456,6 @@ nm_ip4_config_get_dns_option (const NMIP4Config *self, guint i) /*****************************************************************************/ -NMSettingConnectionMdns -nm_ip4_config_mdns_get (const NMIP4Config *self) -{ - return NM_IP4_CONFIG_GET_PRIVATE (self)->mdns; -} - -void -nm_ip4_config_mdns_set (NMIP4Config *self, - NMSettingConnectionMdns mdns) -{ - NM_IP4_CONFIG_GET_PRIVATE (self)->mdns = mdns; -} - -/*****************************************************************************/ - void nm_ip4_config_set_dns_priority (NMIP4Config *self, gint priority) { @@ -2884,9 +2806,9 @@ nm_ip4_config_equal (const NMIP4Config *a, const NMIP4Config *b) { GChecksum *a_checksum = g_checksum_new (G_CHECKSUM_SHA1); GChecksum *b_checksum = g_checksum_new (G_CHECKSUM_SHA1); - guchar a_data[20], b_data[20]; - gsize a_len = sizeof (a_data); - gsize b_len = sizeof (b_data); + gsize a_len = g_checksum_type_get_length (G_CHECKSUM_SHA1); + gsize b_len = g_checksum_type_get_length (G_CHECKSUM_SHA1); + guchar a_data[a_len], b_data[b_len]; gboolean equal; if (a) @@ -2897,8 +2819,7 @@ nm_ip4_config_equal (const NMIP4Config *a, const NMIP4Config *b) g_checksum_get_digest (a_checksum, a_data, &a_len); g_checksum_get_digest (b_checksum, b_data, &b_len); - nm_assert (a_len == sizeof (a_data)); - nm_assert (b_len == sizeof (b_data)); + g_assert (a_len == b_len); equal = !memcmp (a_data, b_data, a_len); g_checksum_free (a_checksum); @@ -2968,7 +2889,7 @@ get_property (GObject *object, guint prop_id, if (*address->label) { g_variant_builder_add (&addr_builder, "{sv}", - NM_IP_ADDRESS_ATTRIBUTE_LABEL, + "label", g_variant_new_string (address->label)); } @@ -3144,7 +3065,6 @@ nm_ip4_config_init (NMIP4Config *self) nm_ip_config_dedup_multi_idx_type_init ((NMIPConfigDedupMultiIdxType *) &priv->idx_ip4_routes, NMP_OBJECT_TYPE_IP4_ROUTE); - priv->mdns = NM_SETTING_CONNECTION_MDNS_DEFAULT; priv->nameservers = g_array_new (FALSE, FALSE, sizeof (guint32)); priv->domains = g_ptr_array_new_with_free_func (g_free); priv->searches = g_ptr_array_new_with_free_func (g_free); @@ -3192,37 +3112,13 @@ finalize (GObject *object) nm_dedup_multi_index_unref (priv->multi_idx); } -static const NMDBusInterfaceInfoExtended interface_info_ip4_config = { - .parent = NM_DEFINE_GDBUS_INTERFACE_INFO_INIT ( - NM_DBUS_INTERFACE_IP4_CONFIG, - .signals = NM_DEFINE_GDBUS_SIGNAL_INFOS ( - &nm_signal_info_property_changed_legacy, - ), - .properties = NM_DEFINE_GDBUS_PROPERTY_INFOS ( - NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Addresses", "aau", NM_IP4_CONFIG_ADDRESSES), - NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("AddressData", "aa{sv}", NM_IP4_CONFIG_ADDRESS_DATA), - NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Gateway", "s", NM_IP4_CONFIG_GATEWAY), - NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Routes", "aau", NM_IP4_CONFIG_ROUTES), - NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("RouteData", "aa{sv}", NM_IP4_CONFIG_ROUTE_DATA), - NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Nameservers", "au", NM_IP4_CONFIG_NAMESERVERS), - NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Domains", "as", NM_IP4_CONFIG_DOMAINS), - NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("Searches", "as", NM_IP4_CONFIG_SEARCHES), - NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("DnsOptions", "as", NM_IP4_CONFIG_DNS_OPTIONS), - NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("DnsPriority", "i", NM_IP4_CONFIG_DNS_PRIORITY), - NM_DEFINE_DBUS_PROPERTY_INFO_EXTENDED_READABLE_L ("WinsServers", "au", NM_IP4_CONFIG_WINS_SERVERS), - ), - ), - .legacy_property_changed = TRUE, -}; - static void nm_ip4_config_class_init (NMIP4ConfigClass *config_class) { GObjectClass *object_class = G_OBJECT_CLASS (config_class); - NMDBusObjectClass *dbus_object_class = NM_DBUS_OBJECT_CLASS (config_class); + NMExportedObjectClass *exported_object_class = NM_EXPORTED_OBJECT_CLASS (config_class); - dbus_object_class->export_path = NM_DBUS_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/IP4Config"); - dbus_object_class->interface_infos = NM_DBUS_INTERFACE_INFOS (&interface_info_ip4_config); + exported_object_class->export_path = NM_EXPORT_PATH_NUMBERED (NM_DBUS_PATH"/IP4Config"); object_class->get_property = get_property; object_class->set_property = set_property; @@ -3302,4 +3198,8 @@ nm_ip4_config_class_init (NMIP4ConfigClass *config_class) G_PARAM_STATIC_STRINGS); g_object_class_install_properties (object_class, _PROPERTY_ENUMS_LAST, obj_properties); + + nm_exported_object_class_add_interface (NM_EXPORTED_OBJECT_CLASS (config_class), + NMDBUS_TYPE_IP4_CONFIG_SKELETON, + NULL); } |