mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-06 03:50:17 +01:00
dns: merge branch 'bg/dns-1-10'
https://github.com/NetworkManager/NetworkManager/pull/235 https://bugzilla.gnome.org/show_bug.cgi?id=746422
This commit is contained in:
commit
1e486a721d
33 changed files with 1327 additions and 859 deletions
|
|
@ -1448,16 +1448,16 @@ src_libNetworkManager_la_SOURCES = \
|
|||
src/dhcp/nm-dhcp-dhclient-utils.c \
|
||||
src/dhcp/nm-dhcp-dhclient-utils.h \
|
||||
\
|
||||
src/dns/nm-dns-manager.c \
|
||||
src/dns/nm-dns-manager.h \
|
||||
src/dns/nm-dns-plugin.c \
|
||||
src/dns/nm-dns-plugin.h \
|
||||
src/dns/nm-dns-dnsmasq.c \
|
||||
src/dns/nm-dns-dnsmasq.h \
|
||||
src/dns/nm-dns-systemd-resolved.c \
|
||||
src/dns/nm-dns-systemd-resolved.h \
|
||||
src/dns/nm-dns-unbound.c \
|
||||
src/dns/nm-dns-unbound.h \
|
||||
src/dns/nm-dns-manager.c \
|
||||
src/dns/nm-dns-manager.h \
|
||||
src/dns/nm-dns-plugin.c \
|
||||
src/dns/nm-dns-plugin.h \
|
||||
\
|
||||
src/dnsmasq/nm-dnsmasq-manager.c \
|
||||
src/dnsmasq/nm-dnsmasq-manager.h \
|
||||
|
|
@ -4545,6 +4545,7 @@ EXTRA_DIST += \
|
|||
shared/nm-utils/c-list-util.c \
|
||||
shared/nm-utils/c-list-util.h \
|
||||
shared/nm-utils/gsystem-local-alloc.h \
|
||||
shared/nm-utils/nm-c-list.h \
|
||||
shared/nm-utils/nm-glib.h \
|
||||
shared/nm-utils/nm-obj.h \
|
||||
shared/nm-utils/nm-macros-internal.h \
|
||||
|
|
|
|||
|
|
@ -5603,6 +5603,14 @@ static const NMMetaPropertyInfo *const property_infos_CONNECTION[] = {
|
|||
| NM_META_PROPERTY_TYP_FLAG_ENUM_GET_PRETTY_TEXT,
|
||||
),
|
||||
),
|
||||
PROPERTY_INFO_WITH_DESC (NM_SETTING_CONNECTION_MDNS,
|
||||
.property_type = &_pt_gobject_enum,
|
||||
.property_typ_data = DEFINE_PROPERTY_TYP_DATA (
|
||||
PROPERTY_TYP_DATA_SUBTYPE (gobject_enum,
|
||||
.get_gtype = nm_setting_connection_mdns_get_type,
|
||||
),
|
||||
),
|
||||
),
|
||||
NULL
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -144,6 +144,7 @@
|
|||
#define DESCRIBE_DOC_NM_SETTING_CONNECTION_INTERFACE_NAME N_("The name of the network interface this connection is bound to. If not set, then the connection can be attached to any interface of the appropriate type (subject to restrictions imposed by other settings). For software devices this specifies the name of the created device. For connection types where interface names cannot easily be made persistent (e.g. mobile broadband or USB Ethernet), this property should not be used. Setting this property restricts the interfaces a connection can be used with, and if interface names change or are reordered the connection may be applied to the wrong interface.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_CONNECTION_LLDP N_("Whether LLDP is enabled for the connection.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_CONNECTION_MASTER N_("Interface name of the master device or UUID of the master connection.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_CONNECTION_MDNS N_("Whether mDNS is enabled for the connection. The permitted values are: yes: register hostname and resolving for the connection, no: disable mDNS for the interface, resolve: do not register hostname but allow resolving of mDNS host names. When updating this property on a currently activated connection, the change takes effect immediately. This feature requires a plugin which supports mDNS. One such plugin is dns-systemd-resolved.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_CONNECTION_METERED N_("Whether the connection is metered. When updating this property on a currently activated connection, the change takes effect immediately.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_CONNECTION_NAME N_("The setting's name, which uniquely identifies the setting within the connection. Each setting type has a name unique to that type, for example \"ppp\" or \"wireless\" or \"wired\".")
|
||||
#define DESCRIBE_DOC_NM_SETTING_CONNECTION_PERMISSIONS N_("An array of strings defining what access a given user has to this connection. If this is NULL or empty, all users are allowed to access this connection; otherwise users are allowed if and only if they are in this list. When this is not empty, the connection can be active only when one of the specified users is logged into an active session. Each entry is of the form \"[type]:[id]:[reserved]\"; for example, \"user:dcbw:blah\". At this time only the \"user\" [type] is allowed. Any other values are ignored and reserved for future use. [id] is the username that this permission refers to, which may not contain the \":\" character. Any [reserved] information present must be ignored and is reserved for future use. All of [type], [id], and [reserved] must be valid UTF-8.")
|
||||
|
|
@ -215,8 +216,8 @@
|
|||
#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DHCP_TIMEOUT N_("A timeout for a DHCP transaction in seconds.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DNS N_("Array of IP addresses of DNS servers.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DNS_OPTIONS N_("Array of DNS options as described in man 5 resolv.conf. NULL means that the options are unset and left at the default. In this case NetworkManager will use default options. This is distinct from an empty list of properties.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DNS_PRIORITY N_("Intra-connection DNS priority. The relative priority to be used when determining the order of DNS servers in resolv.conf. A lower value means that servers will be on top of the file. Zero selects the default value, which is 50 for VPNs and 100 for other connections. Note that the priority is to order DNS settings for multiple active connections. It does not disambiguate multiple DNS servers within the same connection profile. For that, just specify the DNS servers in the desired order. When multiple devices have configurations with the same priority, the one with an active default route will be preferred. Note that when using dns=dnsmasq the order is meaningless since dnsmasq forwards queries to all known servers at the same time. Negative values have the special effect of excluding other configurations with a greater priority value; so in presence of at least a negative priority, only DNS servers from connections with the lowest priority value will be used.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DNS_SEARCH N_("Array of DNS search domains.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DNS_PRIORITY N_("DNS servers priority. The relative priority for DNS servers specified by this setting. A lower value is better (higher priority). Zero selects the default value, which is 50 for VPNs and 100 for other connections. Note that the priority is to order DNS settings for multiple active connections. It does not disambiguate multiple DNS servers within the same connection profile. When using dns=default, servers with higher priority will be on top of resolv.conf. To prioritize a given server over another one within the same connection, just specify them in the desired order. When multiple devices have configurations with the same priority, the one with an active default route will be preferred. Negative values have the special effect of excluding other configurations with a greater priority value; so in presence of at least a negative priority, only DNS servers from connections with the lowest priority value will be used. When using a DNS resolver that supports split-DNS as dns=dnsmasq or dns=systemd-resolved, each connection is used to query domains in its search list. Queries for domains not present in any search list are routed through connections having the '~.' special wildcard domain, which is added automatically to connections with the default route (or can be added manually). When multiple connections specify the same domain, the one with the highest priority (lowest numerical value) wins. If a connection specifies a domain which is subdomain of another domain with a negative DNS priority value, the subdomain is ignored.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_DNS_SEARCH N_("Array of DNS search domains. Domains starting with a tilde ('~') are considered 'routing' domains and are used only to decide the interface over which a query must be forwarded; they are not used to complete unqualified host names.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_GATEWAY N_("The gateway associated with this configuration. This is only meaningful if \"addresses\" is also set.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_IGNORE_AUTO_DNS N_("When \"method\" is set to \"auto\" and this property to TRUE, automatically configured nameservers and search domains are ignored and only nameservers and search domains specified in the \"dns\" and \"dns-search\" properties, if any, are used.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP4_CONFIG_IGNORE_AUTO_ROUTES N_("When \"method\" is set to \"auto\" and this property to TRUE, automatically configured routes are ignored and only routes specified in the \"routes\" property, if any, are used.")
|
||||
|
|
@ -235,8 +236,8 @@
|
|||
#define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DHCP_TIMEOUT N_("A timeout for a DHCP transaction in seconds.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DNS N_("Array of IP addresses of DNS servers.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DNS_OPTIONS N_("Array of DNS options as described in man 5 resolv.conf. NULL means that the options are unset and left at the default. In this case NetworkManager will use default options. This is distinct from an empty list of properties.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DNS_PRIORITY N_("Intra-connection DNS priority. The relative priority to be used when determining the order of DNS servers in resolv.conf. A lower value means that servers will be on top of the file. Zero selects the default value, which is 50 for VPNs and 100 for other connections. Note that the priority is to order DNS settings for multiple active connections. It does not disambiguate multiple DNS servers within the same connection profile. For that, just specify the DNS servers in the desired order. When multiple devices have configurations with the same priority, the one with an active default route will be preferred. Note that when using dns=dnsmasq the order is meaningless since dnsmasq forwards queries to all known servers at the same time. Negative values have the special effect of excluding other configurations with a greater priority value; so in presence of at least a negative priority, only DNS servers from connections with the lowest priority value will be used.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DNS_SEARCH N_("Array of DNS search domains.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DNS_PRIORITY N_("DNS servers priority. The relative priority for DNS servers specified by this setting. A lower value is better (higher priority). Zero selects the default value, which is 50 for VPNs and 100 for other connections. Note that the priority is to order DNS settings for multiple active connections. It does not disambiguate multiple DNS servers within the same connection profile. When using dns=default, servers with higher priority will be on top of resolv.conf. To prioritize a given server over another one within the same connection, just specify them in the desired order. When multiple devices have configurations with the same priority, the one with an active default route will be preferred. Negative values have the special effect of excluding other configurations with a greater priority value; so in presence of at least a negative priority, only DNS servers from connections with the lowest priority value will be used. When using a DNS resolver that supports split-DNS as dns=dnsmasq or dns=systemd-resolved, each connection is used to query domains in its search list. Queries for domains not present in any search list are routed through connections having the '~.' special wildcard domain, which is added automatically to connections with the default route (or can be added manually). When multiple connections specify the same domain, the one with the highest priority (lowest numerical value) wins. If a connection specifies a domain which is subdomain of another domain with a negative DNS priority value, the subdomain is ignored.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_DNS_SEARCH N_("Array of DNS search domains. Domains starting with a tilde ('~') are considered 'routing' domains and are used only to decide the interface over which a query must be forwarded; they are not used to complete unqualified host names.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_GATEWAY N_("The gateway associated with this configuration. This is only meaningful if \"addresses\" is also set.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_IGNORE_AUTO_DNS N_("When \"method\" is set to \"auto\" and this property to TRUE, automatically configured nameservers and search domains are ignored and only nameservers and search domains specified in the \"dns\" and \"dns-search\" properties, if any, are used.")
|
||||
#define DESCRIBE_DOC_NM_SETTING_IP6_CONFIG_IGNORE_AUTO_ROUTES N_("When \"method\" is set to \"auto\" and this property to TRUE, automatically configured routes are ignored and only routes specified in the \"routes\" property, if any, are used.")
|
||||
|
|
|
|||
|
|
@ -81,6 +81,7 @@ typedef struct {
|
|||
NMMetered metered;
|
||||
NMSettingConnectionLldp lldp;
|
||||
gint auth_retries;
|
||||
int mdns;
|
||||
} NMSettingConnectionPrivate;
|
||||
|
||||
enum {
|
||||
|
|
@ -103,6 +104,7 @@ enum {
|
|||
PROP_GATEWAY_PING_TIMEOUT,
|
||||
PROP_METERED,
|
||||
PROP_LLDP,
|
||||
PROP_MDNS,
|
||||
PROP_STABLE_ID,
|
||||
PROP_AUTH_RETRIES,
|
||||
|
||||
|
|
@ -862,6 +864,23 @@ nm_setting_connection_get_lldp (NMSettingConnection *setting)
|
|||
return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->lldp;
|
||||
}
|
||||
|
||||
/**
|
||||
* nm_setting_connection_get_mdns:
|
||||
* @setting: the #NMSettingConnection
|
||||
*
|
||||
* Returns: the #NMSettingConnection:mdns property of the setting.
|
||||
*
|
||||
* Since: 1.10.14
|
||||
**/
|
||||
NMSettingConnectionMdns
|
||||
nm_setting_connection_get_mdns (NMSettingConnection *setting)
|
||||
{
|
||||
g_return_val_if_fail (NM_IS_SETTING_CONNECTION (setting),
|
||||
NM_SETTING_CONNECTION_MDNS_DEFAULT);
|
||||
|
||||
return NM_SETTING_CONNECTION_GET_PRIVATE (setting)->mdns;
|
||||
}
|
||||
|
||||
static void
|
||||
_set_error_missing_base_setting (GError **error, const char *type)
|
||||
{
|
||||
|
|
@ -1057,6 +1076,17 @@ verify (NMSetting *setting, NMConnection *connection, GError **error)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
if ( priv->mdns < NM_SETTING_CONNECTION_MDNS_DEFAULT
|
||||
|| priv->mdns > NM_SETTING_CONNECTION_MDNS_YES) {
|
||||
g_set_error (error,
|
||||
NM_CONNECTION_ERROR,
|
||||
NM_CONNECTION_ERROR_INVALID_PROPERTY,
|
||||
_("mdns value %d is not valid"), priv->mdns);
|
||||
g_prefix_error (error, "%s.%s: ", NM_SETTING_CONNECTION_SETTING_NAME,
|
||||
NM_SETTING_CONNECTION_MDNS);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* *** errors above here should be always fatal, below NORMALIZABLE_ERROR *** */
|
||||
|
||||
if (!priv->uuid) {
|
||||
|
|
@ -1214,6 +1244,9 @@ compare_property (NMSetting *setting,
|
|||
static void
|
||||
nm_setting_connection_init (NMSettingConnection *setting)
|
||||
{
|
||||
NMSettingConnectionPrivate *priv = NM_SETTING_CONNECTION_GET_PRIVATE (setting);
|
||||
|
||||
priv->mdns = NM_SETTING_CONNECTION_MDNS_DEFAULT;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -1332,6 +1365,9 @@ set_property (GObject *object, guint prop_id,
|
|||
case PROP_AUTH_RETRIES:
|
||||
priv->auth_retries = g_value_get_int (value);
|
||||
break;
|
||||
case PROP_MDNS:
|
||||
priv->mdns = g_value_get_int (value);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
|
|
@ -1420,6 +1456,9 @@ get_property (GObject *object, guint prop_id,
|
|||
case PROP_AUTH_RETRIES:
|
||||
g_value_set_int (value, priv->auth_retries);
|
||||
break;
|
||||
case PROP_MDNS:
|
||||
g_value_set_int (value, priv->mdns);
|
||||
break;
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
break;
|
||||
|
|
@ -1982,4 +2021,37 @@ nm_setting_connection_class_init (NMSettingConnectionClass *setting_class)
|
|||
G_PARAM_CONSTRUCT |
|
||||
NM_SETTING_PARAM_FUZZY_IGNORE |
|
||||
G_PARAM_STATIC_STRINGS));
|
||||
|
||||
/**
|
||||
* NMSettingConnection:mdns:
|
||||
*
|
||||
* Whether mDNS is enabled for the connection.
|
||||
*
|
||||
* The permitted values are: yes: register hostname and resolving
|
||||
* for the connection, no: disable mDNS for the interface, resolve:
|
||||
* do not register hostname but allow resolving of mDNS host names.
|
||||
* When updating this property on a currently activated connection,
|
||||
* the change takes effect immediately.
|
||||
*
|
||||
* This feature requires a plugin which supports mDNS. One such
|
||||
* plugin is dns-systemd-resolved.
|
||||
*
|
||||
* Since: 1.10.14
|
||||
**/
|
||||
/* ---ifcfg-rh---
|
||||
* property: mdns
|
||||
* variable: CONNECTION_MDNS(+)
|
||||
* values: yes,no,resolve
|
||||
* default: missing variable means global default
|
||||
* description: Whether or not mDNS is enabled for the connection
|
||||
* example: CONNECTION_MDNS=yes
|
||||
* ---end---
|
||||
*/
|
||||
g_object_class_install_property
|
||||
(object_class, PROP_MDNS,
|
||||
g_param_spec_int (NM_SETTING_CONNECTION_MDNS, "", "",
|
||||
G_MININT32, G_MAXINT32,
|
||||
NM_SETTING_CONNECTION_MDNS_DEFAULT,
|
||||
G_PARAM_READWRITE |
|
||||
G_PARAM_STATIC_STRINGS));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@ G_BEGIN_DECLS
|
|||
#define NM_SETTING_CONNECTION_METERED "metered"
|
||||
#define NM_SETTING_CONNECTION_LLDP "lldp"
|
||||
#define NM_SETTING_CONNECTION_AUTH_RETRIES "auth-retries"
|
||||
#define NM_SETTING_CONNECTION_MDNS "mdns"
|
||||
|
||||
/* Types for property values */
|
||||
/**
|
||||
|
|
@ -97,6 +98,24 @@ typedef enum {
|
|||
NM_SETTING_CONNECTION_LLDP_ENABLE_RX = 1,
|
||||
} NMSettingConnectionLldp;
|
||||
|
||||
/**
|
||||
* NMSettingConnectionMdns:
|
||||
* @NM_SETTING_CONNECTION_MDNS_DEFAULT: default value
|
||||
* @NM_SETTING_CONNECTION_MDNS_NO: disable mDNS
|
||||
* @NM_SETTING_CONNECTION_MDNS_RESOLVE: support only resolving, do not register hostname
|
||||
* @NM_SETTING_CONNECTION_MDNS_YES: enable mDNS
|
||||
*
|
||||
* #NMSettingConnectionMdns values indicate whether mDNS should be enabled.
|
||||
*
|
||||
* Since: 1.10.14
|
||||
*/
|
||||
typedef enum {
|
||||
NM_SETTING_CONNECTION_MDNS_DEFAULT = -1,
|
||||
NM_SETTING_CONNECTION_MDNS_NO = 0,
|
||||
NM_SETTING_CONNECTION_MDNS_RESOLVE = 1,
|
||||
NM_SETTING_CONNECTION_MDNS_YES = 2,
|
||||
} NMSettingConnectionMdns;
|
||||
|
||||
/**
|
||||
* NMSettingConnection:
|
||||
*
|
||||
|
|
@ -170,6 +189,8 @@ NMSettingConnectionLldp nm_setting_connection_get_lldp (NMSettingConnection *set
|
|||
NM_AVAILABLE_IN_1_10
|
||||
gint nm_setting_connection_get_auth_retries (NMSettingConnection *setting);
|
||||
|
||||
NM_AVAILABLE_IN_1_10_14
|
||||
NMSettingConnectionMdns nm_setting_connection_get_mdns (NMSettingConnection *setting);
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __NM_SETTING_CONNECTION_H__ */
|
||||
|
|
|
|||
|
|
@ -2960,7 +2960,10 @@ nm_setting_ip_config_class_init (NMSettingIPConfigClass *setting_class)
|
|||
/**
|
||||
* NMSettingIPConfig:dns-search:
|
||||
*
|
||||
* Array of DNS search domains.
|
||||
* Array of DNS search domains. Domains starting with a tilde ('~')
|
||||
* are considered 'routing' domains and are used only to decide the
|
||||
* interface over which a query must be forwarded; they are not used
|
||||
* to complete unqualified host names.
|
||||
**/
|
||||
g_object_class_install_property
|
||||
(object_class, PROP_DNS_SEARCH,
|
||||
|
|
@ -2990,24 +2993,34 @@ nm_setting_ip_config_class_init (NMSettingIPConfigClass *setting_class)
|
|||
/**
|
||||
* NMSettingIPConfig:dns-priority:
|
||||
*
|
||||
* Intra-connection DNS priority.
|
||||
* DNS servers priority.
|
||||
*
|
||||
* The relative priority to be used when determining the order of DNS
|
||||
* servers in resolv.conf. A lower value means that servers will be on top
|
||||
* of the file. Zero selects the default value, which is 50 for VPNs and
|
||||
* 100 for other connections. Note that the priority is to order DNS
|
||||
* settings for multiple active connections. It does not disambiguate
|
||||
* multiple DNS servers within the same connection profile. For that,
|
||||
* just specify the DNS servers in the desired order.
|
||||
* When multiple devices have configurations with the same priority, the
|
||||
* one with an active default route will be preferred.
|
||||
* Note that when using dns=dnsmasq the order is meaningless
|
||||
* since dnsmasq forwards queries to all known servers at the same time.
|
||||
* The relative priority for DNS servers specified by this setting. A lower
|
||||
* value is better (higher priority). Zero selects the default value, which
|
||||
* is 50 for VPNs and 100 for other connections.
|
||||
*
|
||||
* Negative values have the special effect of excluding other configurations
|
||||
* with a greater priority value; so in presence of at least a negative
|
||||
* priority, only DNS servers from connections with the lowest priority
|
||||
* value will be used.
|
||||
* Note that the priority is to order DNS settings for multiple active
|
||||
* connections. It does not disambiguate multiple DNS servers within the
|
||||
* same connection profile.
|
||||
*
|
||||
* When using dns=default, servers with higher priority will be on top of
|
||||
* resolv.conf. To prioritize a given server over another one within the
|
||||
* same connection, just specify them in the desired order. When multiple
|
||||
* devices have configurations with the same priority, the one with an
|
||||
* active default route will be preferred. Negative values have the special
|
||||
* effect of excluding other configurations with a greater priority value;
|
||||
* so in presence of at least a negative priority, only DNS servers from
|
||||
* connections with the lowest priority value will be used.
|
||||
*
|
||||
* When using a DNS resolver that supports split-DNS as dns=dnsmasq or
|
||||
* dns=systemd-resolved, each connection is used to query domains in its
|
||||
* search list. Queries for domains not present in any search list are
|
||||
* routed through connections having the '~.' special wildcard domain, which
|
||||
* is added automatically to connections with the default route (or can be
|
||||
* added manually). When multiple connections specify the same domain, the
|
||||
* one with the highest priority (lowest numerical value) wins. If a
|
||||
* connection specifies a domain which is subdomain of another domain with a
|
||||
* negative DNS priority value, the subdomain is ignored.
|
||||
*
|
||||
* Since: 1.4
|
||||
**/
|
||||
|
|
|
|||
|
|
@ -152,4 +152,11 @@
|
|||
# define NM_AVAILABLE_IN_1_10_2
|
||||
#endif
|
||||
|
||||
#if NM_VERSION_MAX_ALLOWED < NM_VERSION_1_10_14
|
||||
# define NM_AVAILABLE_IN_1_10_14 G_UNAVAILABLE(1,10.14)
|
||||
#else
|
||||
# define NM_AVAILABLE_IN_1_10_14
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* NM_VERSION_H */
|
||||
|
|
|
|||
|
|
@ -2572,6 +2572,7 @@ test_connection_diff_a_only (void)
|
|||
{ NM_SETTING_CONNECTION_METERED, NM_SETTING_DIFF_RESULT_IN_A },
|
||||
{ NM_SETTING_CONNECTION_LLDP, NM_SETTING_DIFF_RESULT_IN_A },
|
||||
{ NM_SETTING_CONNECTION_AUTH_RETRIES, NM_SETTING_DIFF_RESULT_IN_A },
|
||||
{ NM_SETTING_CONNECTION_MDNS, NM_SETTING_DIFF_RESULT_IN_A },
|
||||
{ NULL, NM_SETTING_DIFF_RESULT_UNKNOWN }
|
||||
} },
|
||||
{ NM_SETTING_WIRED_SETTING_NAME, {
|
||||
|
|
|
|||
|
|
@ -1331,3 +1331,9 @@ global:
|
|||
nm_utils_tc_tfilter_from_str;
|
||||
nm_utils_tc_tfilter_to_str;
|
||||
} libnm_1_10_0;
|
||||
|
||||
libnm_1_10_14 {
|
||||
global:
|
||||
nm_setting_connection_get_mdns;
|
||||
nm_setting_connection_mdns_get_type;
|
||||
} libnm_1_10_2;
|
||||
|
|
|
|||
|
|
@ -654,6 +654,9 @@ ipv6.ip6-privacy=0
|
|||
<varlistentry>
|
||||
<term><varname>connection.lldp</varname></term>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><varname>connection.mdns</varname></term>
|
||||
</varlistentry>
|
||||
<varlistentry>
|
||||
<term><varname>connection.stable-id</varname></term>
|
||||
</varlistentry>
|
||||
|
|
|
|||
74
shared/nm-utils/nm-c-list.h
Normal file
74
shared/nm-utils/nm-c-list.h
Normal file
|
|
@ -0,0 +1,74 @@
|
|||
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||
/* NetworkManager -- Network link manager
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the
|
||||
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* (C) Copyright 2014 Red Hat, Inc.
|
||||
*/
|
||||
|
||||
#ifndef __NM_C_LIST_H__
|
||||
#define __NM_C_LIST_H__
|
||||
|
||||
#include "c-list.h"
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
typedef struct {
|
||||
CList lst;
|
||||
void *data;
|
||||
} NMCListElem;
|
||||
|
||||
static inline NMCListElem *
|
||||
nm_c_list_elem_new_stale (void *data)
|
||||
{
|
||||
NMCListElem *elem;
|
||||
|
||||
elem = g_slice_new (NMCListElem);
|
||||
elem->data = data;
|
||||
return elem;
|
||||
}
|
||||
|
||||
static inline void *
|
||||
nm_c_list_elem_get (CList *lst)
|
||||
{
|
||||
if (!lst)
|
||||
return NULL;
|
||||
return c_list_entry (lst, NMCListElem, lst)->data;
|
||||
}
|
||||
|
||||
static inline void
|
||||
nm_c_list_elem_free (NMCListElem *elem)
|
||||
{
|
||||
if (elem) {
|
||||
c_list_unlink_stale (&elem->lst);
|
||||
g_slice_free (NMCListElem, elem);
|
||||
}
|
||||
}
|
||||
|
||||
static inline void
|
||||
nm_c_list_elem_free_all (CList *head, GDestroyNotify free_fcn)
|
||||
{
|
||||
NMCListElem *elem;
|
||||
|
||||
while ((elem = c_list_first_entry (head, NMCListElem, lst))) {
|
||||
if (free_fcn)
|
||||
free_fcn (elem->data);
|
||||
c_list_unlink_stale (&elem->lst);
|
||||
g_slice_free (NMCListElem, elem);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* __NM_C_LIST_H__ */
|
||||
|
|
@ -1020,6 +1020,25 @@ nm_cmp_uint32_p_with_data (gconstpointer p_a, gconstpointer p_b, gpointer user_d
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int
|
||||
nm_cmp_int2ptr_p_with_data (gconstpointer p_a, gconstpointer p_b, gpointer user_data)
|
||||
{
|
||||
/* p_a and p_b are two pointers to a pointer, where the pointer is
|
||||
* interpreted as a integer using GPOINTER_TO_INT().
|
||||
*
|
||||
* That is the case of a hash-table that uses GINT_TO_POINTER() to
|
||||
* convert integers as pointers, and the resulting keys-as-array
|
||||
* array. */
|
||||
const int a = GPOINTER_TO_INT (*((gconstpointer *) p_a));
|
||||
const int b = GPOINTER_TO_INT (*((gconstpointer *) p_b));
|
||||
|
||||
if (a < b)
|
||||
return -1;
|
||||
if (a > b)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/* Taken from systemd's UNIQ_T and UNIQ macros. */
|
||||
|
|
|
|||
|
|
@ -1788,6 +1788,34 @@ out:
|
|||
return nm_utils_ip_route_metric_normalize (addr_family, route_metric);
|
||||
}
|
||||
|
||||
static NMSettingConnectionMdns
|
||||
_get_mdns (NMDevice *self)
|
||||
{
|
||||
NMConnection *connection;
|
||||
NMSettingConnectionMdns mdns = NM_SETTING_CONNECTION_MDNS_DEFAULT;
|
||||
|
||||
g_return_val_if_fail (NM_IS_DEVICE (self), NM_SETTING_CONNECTION_MDNS_DEFAULT);
|
||||
|
||||
connection = nm_device_get_applied_connection (self);
|
||||
if (connection)
|
||||
mdns = nm_setting_connection_get_mdns (nm_connection_get_setting_connection (connection));
|
||||
|
||||
if (mdns == NM_SETTING_CONNECTION_MDNS_DEFAULT) {
|
||||
gs_free char *value = NULL;
|
||||
|
||||
value = nm_config_data_get_connection_default (NM_CONFIG_GET_DATA,
|
||||
"connection.mdns",
|
||||
self);
|
||||
mdns = _nm_utils_ascii_str_to_int64 (value,
|
||||
10,
|
||||
NM_SETTING_CONNECTION_MDNS_NO,
|
||||
NM_SETTING_CONNECTION_MDNS_YES,
|
||||
NM_SETTING_CONNECTION_MDNS_DEFAULT);
|
||||
}
|
||||
|
||||
return mdns;
|
||||
}
|
||||
|
||||
guint32
|
||||
nm_device_get_route_table (NMDevice *self,
|
||||
int addr_family,
|
||||
|
|
@ -5867,6 +5895,7 @@ ensure_con_ip4_config (NMDevice *self)
|
|||
priv->con_ip4_config = _ip4_config_new (self);
|
||||
nm_ip4_config_merge_setting (priv->con_ip4_config,
|
||||
nm_connection_get_setting_ip4_config (connection),
|
||||
_get_mdns (self),
|
||||
nm_device_get_route_table (self, AF_INET, TRUE),
|
||||
nm_device_get_route_metric (self, AF_INET));
|
||||
|
||||
|
|
@ -6177,6 +6206,7 @@ dhcp4_state_changed (NMDhcpClient *client,
|
|||
manual = _ip4_config_new (self);
|
||||
nm_ip4_config_merge_setting (manual,
|
||||
nm_connection_get_setting_ip4_config (connection),
|
||||
NM_SETTING_CONNECTION_MDNS_DEFAULT,
|
||||
nm_device_get_route_table (self, AF_INET, TRUE),
|
||||
nm_device_get_route_metric (self, AF_INET));
|
||||
|
||||
|
|
@ -6555,6 +6585,7 @@ act_stage3_ip4_config_start (NMDevice *self,
|
|||
config = _ip4_config_new (self);
|
||||
nm_ip4_config_merge_setting (config,
|
||||
nm_connection_get_setting_ip4_config (connection),
|
||||
NM_SETTING_CONNECTION_MDNS_DEFAULT,
|
||||
nm_device_get_route_table (self, AF_INET, TRUE),
|
||||
nm_device_get_route_metric (self, AF_INET));
|
||||
|
||||
|
|
@ -9250,6 +9281,7 @@ nm_device_reactivate_ip4_config (NMDevice *self,
|
|||
priv->con_ip4_config = _ip4_config_new (self);
|
||||
nm_ip4_config_merge_setting (priv->con_ip4_config,
|
||||
s_ip4_new,
|
||||
_get_mdns (self),
|
||||
nm_device_get_route_table (self, AF_INET, TRUE),
|
||||
nm_device_get_route_metric (self, AF_INET));
|
||||
|
||||
|
|
|
|||
|
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include "nm-setting-connection.h"
|
||||
#include "nm-exported-object.h"
|
||||
#include "nm-dbus-interface.h"
|
||||
#include "nm-connection.h"
|
||||
|
|
|
|||
|
|
@ -75,66 +75,6 @@ G_DEFINE_TYPE (NMDnsDnsmasq, nm_dns_dnsmasq, NM_TYPE_DNS_PLUGIN)
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
static char **
|
||||
get_ip4_rdns_domains (NMIP4Config *ip4)
|
||||
{
|
||||
char **strv;
|
||||
GPtrArray *domains = NULL;
|
||||
NMDedupMultiIter ipconf_iter;
|
||||
const NMPlatformIP4Address *address;
|
||||
const NMPlatformIP4Route *route;
|
||||
|
||||
g_return_val_if_fail (ip4 != NULL, NULL);
|
||||
|
||||
domains = g_ptr_array_sized_new (5);
|
||||
|
||||
nm_ip_config_iter_ip4_address_for_each (&ipconf_iter, ip4, &address)
|
||||
nm_utils_get_reverse_dns_domains_ip4 (address->address, address->plen, domains);
|
||||
|
||||
nm_ip_config_iter_ip4_route_for_each (&ipconf_iter, ip4, &route) {
|
||||
if (!NM_PLATFORM_IP_ROUTE_IS_DEFAULT (route))
|
||||
nm_utils_get_reverse_dns_domains_ip4 (route->network, route->plen, domains);
|
||||
}
|
||||
|
||||
/* Terminating NULL so we can use g_strfreev() to free it */
|
||||
g_ptr_array_add (domains, NULL);
|
||||
|
||||
/* Free the array and return NULL if the only element was the ending NULL */
|
||||
strv = (char **) g_ptr_array_free (domains, (domains->len == 1));
|
||||
|
||||
return _nm_utils_strv_cleanup (strv, FALSE, FALSE, TRUE);
|
||||
}
|
||||
|
||||
static char **
|
||||
get_ip6_rdns_domains (NMIP6Config *ip6)
|
||||
{
|
||||
char **strv;
|
||||
GPtrArray *domains = NULL;
|
||||
NMDedupMultiIter ipconf_iter;
|
||||
const NMPlatformIP6Address *address;
|
||||
const NMPlatformIP6Route *route;
|
||||
|
||||
g_return_val_if_fail (ip6 != NULL, NULL);
|
||||
|
||||
domains = g_ptr_array_sized_new (5);
|
||||
|
||||
nm_ip_config_iter_ip6_address_for_each (&ipconf_iter, ip6, &address)
|
||||
nm_utils_get_reverse_dns_domains_ip6 (&address->address, address->plen, domains);
|
||||
|
||||
nm_ip_config_iter_ip6_route_for_each (&ipconf_iter, ip6, &route) {
|
||||
if (!NM_PLATFORM_IP_ROUTE_IS_DEFAULT (route))
|
||||
nm_utils_get_reverse_dns_domains_ip6 (&route->network, route->plen, domains);
|
||||
}
|
||||
|
||||
/* Terminating NULL so we can use g_strfreev() to free it */
|
||||
g_ptr_array_add (domains, NULL);
|
||||
|
||||
/* Free the array and return NULL if the only element was the ending NULL */
|
||||
strv = (char **) g_ptr_array_free (domains, (domains->len == 1));
|
||||
|
||||
return _nm_utils_strv_cleanup (strv, FALSE, FALSE, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
add_dnsmasq_nameserver (NMDnsDnsmasq *self,
|
||||
GVariantBuilder *servers,
|
||||
|
|
@ -155,96 +95,43 @@ add_dnsmasq_nameserver (NMDnsDnsmasq *self,
|
|||
g_variant_builder_close (servers);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
add_ip4_config (NMDnsDnsmasq *self, GVariantBuilder *servers, NMIP4Config *ip4,
|
||||
const char *iface, gboolean split)
|
||||
#define IP_ADDR_TO_STRING_BUFLEN (NM_UTILS_INET_ADDRSTRLEN + 1 + IFNAMSIZ)
|
||||
|
||||
static const char *
|
||||
ip_addr_to_string (int addr_family, gconstpointer addr, const char *iface, char *out_buf)
|
||||
{
|
||||
char buf[INET_ADDRSTRLEN + 1 + IFNAMSIZ];
|
||||
char buf2[INET_ADDRSTRLEN];
|
||||
in_addr_t addr;
|
||||
int nnameservers, i_nameserver, n, i;
|
||||
gboolean added = FALSE;
|
||||
int n_written;
|
||||
char buf2[NM_UTILS_INET_ADDRSTRLEN];
|
||||
const char *separator;
|
||||
|
||||
g_return_val_if_fail (iface, FALSE);
|
||||
nnameservers = nm_ip4_config_get_num_nameservers (ip4);
|
||||
nm_assert_addr_family (addr_family);
|
||||
nm_assert (addr);
|
||||
nm_assert (out_buf);
|
||||
|
||||
if (split) {
|
||||
char **domains, **iter;
|
||||
|
||||
if (nnameservers == 0)
|
||||
return FALSE;
|
||||
|
||||
for (i_nameserver = 0; i_nameserver < nnameservers; i_nameserver++) {
|
||||
addr = nm_ip4_config_get_nameserver (ip4, i_nameserver);
|
||||
g_snprintf (buf, sizeof (buf), "%s@%s",
|
||||
nm_utils_inet4_ntop (addr, buf2), iface);
|
||||
|
||||
/* searches are preferred over domains */
|
||||
n = nm_ip4_config_get_num_searches (ip4);
|
||||
for (i = 0; i < n; i++) {
|
||||
add_dnsmasq_nameserver (self,
|
||||
servers,
|
||||
buf,
|
||||
nm_ip4_config_get_search (ip4, i));
|
||||
added = TRUE;
|
||||
}
|
||||
|
||||
if (n == 0) {
|
||||
/* If not searches, use any domains */
|
||||
n = nm_ip4_config_get_num_domains (ip4);
|
||||
for (i = 0; i < n; i++) {
|
||||
add_dnsmasq_nameserver (self,
|
||||
servers,
|
||||
buf,
|
||||
nm_ip4_config_get_domain (ip4, i));
|
||||
added = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Ensure reverse-DNS works by directing queries for in-addr.arpa
|
||||
* domains to the split domain's nameserver.
|
||||
*/
|
||||
domains = get_ip4_rdns_domains (ip4);
|
||||
if (domains) {
|
||||
for (iter = domains; iter && *iter; iter++)
|
||||
add_dnsmasq_nameserver (self, servers, buf, *iter);
|
||||
g_strfreev (domains);
|
||||
}
|
||||
}
|
||||
if (addr_family == AF_INET) {
|
||||
nm_utils_inet_ntop (addr_family, addr, buf2);
|
||||
separator = "@";
|
||||
} else {
|
||||
if (IN6_IS_ADDR_V4MAPPED (addr))
|
||||
nm_utils_inet4_ntop (((const struct in6_addr *) addr)->s6_addr32[3], buf2);
|
||||
else
|
||||
nm_utils_inet6_ntop (addr, buf2);
|
||||
/* Need to scope link-local addresses with %<zone-id>. Before dnsmasq 2.58,
|
||||
* only '@' was supported as delimiter. Since 2.58, '@' and '%' are
|
||||
* supported. Due to a bug, since 2.73 only '%' works properly as "server"
|
||||
* address.
|
||||
*/
|
||||
separator = IN6_IS_ADDR_LINKLOCAL (addr) ? "%" : "@";
|
||||
}
|
||||
|
||||
/* If no searches or domains, just add the nameservers */
|
||||
if (!added) {
|
||||
for (i = 0; i < nnameservers; i++) {
|
||||
addr = nm_ip4_config_get_nameserver (ip4, i);
|
||||
g_snprintf (buf, sizeof (buf), "%s@%s",
|
||||
nm_utils_inet4_ntop (addr, buf2), iface);
|
||||
add_dnsmasq_nameserver (self, servers, buf, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static char *
|
||||
ip6_addr_to_string (const struct in6_addr *addr, const char *iface)
|
||||
{
|
||||
char buf[NM_UTILS_INET_ADDRSTRLEN];
|
||||
|
||||
if (IN6_IS_ADDR_V4MAPPED (addr))
|
||||
nm_utils_inet4_ntop (addr->s6_addr32[3], buf);
|
||||
else
|
||||
nm_utils_inet6_ntop (addr, buf);
|
||||
|
||||
/* Need to scope link-local addresses with %<zone-id>. Before dnsmasq 2.58,
|
||||
* only '@' was supported as delimiter. Since 2.58, '@' and '%' are
|
||||
* supported. Due to a bug, since 2.73 only '%' works properly as "server"
|
||||
* address.
|
||||
*/
|
||||
return g_strdup_printf ("%s%c%s",
|
||||
buf,
|
||||
IN6_IS_ADDR_LINKLOCAL (addr) ? '%' : '@',
|
||||
iface);
|
||||
n_written = g_snprintf (out_buf,
|
||||
IP_ADDR_TO_STRING_BUFLEN,
|
||||
"%s%s%s",
|
||||
buf2,
|
||||
iface ? separator : "",
|
||||
iface ?: "");
|
||||
nm_assert (n_written < IP_ADDR_TO_STRING_BUFLEN);
|
||||
return out_buf;
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -271,96 +158,39 @@ add_global_config (NMDnsDnsmasq *self, GVariantBuilder *dnsmasq_servers, const N
|
|||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
add_ip6_config (NMDnsDnsmasq *self, GVariantBuilder *servers, NMIP6Config *ip6,
|
||||
const char *iface, gboolean split)
|
||||
static void
|
||||
add_ip_config (NMDnsDnsmasq *self, GVariantBuilder *servers, const NMDnsIPConfigData *ip_data)
|
||||
{
|
||||
const struct in6_addr *addr;
|
||||
char *buf = NULL;
|
||||
int nnameservers, i_nameserver, n, i;
|
||||
gboolean added = FALSE;
|
||||
NMIPConfig *ip_config = ip_data->ip_config;
|
||||
gconstpointer addr;
|
||||
const char *iface, *domain;
|
||||
char ip_addr_to_string_buf[IP_ADDR_TO_STRING_BUFLEN];
|
||||
int addr_family;
|
||||
guint i, j, num;
|
||||
|
||||
g_return_val_if_fail (iface, FALSE);
|
||||
nnameservers = nm_ip6_config_get_num_nameservers (ip6);
|
||||
iface = nm_platform_link_get_name (NM_PLATFORM_GET, ip_data->data->ifindex);
|
||||
addr_family = nm_ip_config_get_addr_family (ip_config);
|
||||
|
||||
if (split) {
|
||||
char **domains, **iter;
|
||||
|
||||
if (nnameservers == 0)
|
||||
return FALSE;
|
||||
|
||||
for (i_nameserver = 0; i_nameserver < nnameservers; i_nameserver++) {
|
||||
addr = nm_ip6_config_get_nameserver (ip6, i_nameserver);
|
||||
buf = ip6_addr_to_string (addr, iface);
|
||||
|
||||
/* searches are preferred over domains */
|
||||
n = nm_ip6_config_get_num_searches (ip6);
|
||||
for (i = 0; i < n; i++) {
|
||||
add_dnsmasq_nameserver (self,
|
||||
servers,
|
||||
buf,
|
||||
nm_ip6_config_get_search (ip6, i));
|
||||
added = TRUE;
|
||||
}
|
||||
|
||||
if (n == 0) {
|
||||
/* If not searches, use any domains */
|
||||
n = nm_ip6_config_get_num_domains (ip6);
|
||||
for (i = 0; i < n; i++) {
|
||||
add_dnsmasq_nameserver (self,
|
||||
servers,
|
||||
buf,
|
||||
nm_ip6_config_get_domain (ip6, i));
|
||||
added = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Ensure reverse-DNS works by directing queries for ip6.arpa
|
||||
* domains to the split domain's nameserver.
|
||||
*/
|
||||
domains = get_ip6_rdns_domains (ip6);
|
||||
if (domains) {
|
||||
for (iter = domains; iter && *iter; iter++)
|
||||
add_dnsmasq_nameserver (self, servers, buf, *iter);
|
||||
g_strfreev (domains);
|
||||
}
|
||||
|
||||
g_free (buf);
|
||||
num = nm_ip_config_get_num_nameservers (ip_config);
|
||||
for (i = 0; i < num; i++) {
|
||||
addr = nm_ip_config_get_nameserver (ip_config, i);
|
||||
ip_addr_to_string (addr_family, addr, iface, ip_addr_to_string_buf);
|
||||
for (j = 0; ip_data->domains.search[j]; j++) {
|
||||
domain = nm_utils_parse_dns_domain (ip_data->domains.search[j], NULL);
|
||||
add_dnsmasq_nameserver (self,
|
||||
servers,
|
||||
ip_addr_to_string_buf,
|
||||
domain[0] ? domain : NULL);
|
||||
}
|
||||
}
|
||||
|
||||
/* If no searches or domains, just add the nameservers */
|
||||
if (!added) {
|
||||
for (i = 0; i < nnameservers; i++) {
|
||||
addr = nm_ip6_config_get_nameserver (ip6, i);
|
||||
buf = ip6_addr_to_string (addr, iface);
|
||||
if (buf) {
|
||||
add_dnsmasq_nameserver (self, servers, buf, NULL);
|
||||
g_free (buf);
|
||||
if (ip_data->domains.reverse) {
|
||||
for (j = 0; ip_data->domains.reverse[j]; j++) {
|
||||
add_dnsmasq_nameserver (self, servers,
|
||||
ip_addr_to_string_buf,
|
||||
ip_data->domains.reverse[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
add_ip_config_data (NMDnsDnsmasq *self, GVariantBuilder *servers, const NMDnsIPConfigData *data)
|
||||
{
|
||||
if (NM_IS_IP4_CONFIG (data->config)) {
|
||||
return add_ip4_config (self,
|
||||
servers,
|
||||
(NMIP4Config *) data->config,
|
||||
data->iface,
|
||||
data->type == NM_DNS_IP_CONFIG_TYPE_VPN);
|
||||
} else if (NM_IS_IP6_CONFIG (data->config)) {
|
||||
return add_ip6_config (self,
|
||||
servers,
|
||||
(NMIP6Config *) data->config,
|
||||
data->iface,
|
||||
data->type == NM_DNS_IP_CONFIG_TYPE_VPN);
|
||||
} else
|
||||
g_return_val_if_reached (FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -550,15 +380,14 @@ start_dnsmasq (NMDnsDnsmasq *self)
|
|||
|
||||
static gboolean
|
||||
update (NMDnsPlugin *plugin,
|
||||
const GPtrArray *configs,
|
||||
const NMGlobalDnsConfig *global_config,
|
||||
const CList *ip_config_lst_head,
|
||||
const char *hostname)
|
||||
{
|
||||
NMDnsDnsmasq *self = NM_DNS_DNSMASQ (plugin);
|
||||
NMDnsDnsmasqPrivate *priv = NM_DNS_DNSMASQ_GET_PRIVATE (self);
|
||||
GVariantBuilder servers;
|
||||
guint i;
|
||||
int prio, first_prio;
|
||||
const NMDnsIPConfigData *ip_data;
|
||||
|
||||
start_dnsmasq (self);
|
||||
|
||||
|
|
@ -567,16 +396,8 @@ update (NMDnsPlugin *plugin,
|
|||
if (global_config)
|
||||
add_global_config (self, &servers, global_config);
|
||||
else {
|
||||
for (i = 0; i < configs->len; i++) {
|
||||
const NMDnsIPConfigData *data = configs->pdata[i];
|
||||
|
||||
prio = nm_ip_config_get_dns_priority (data->config);
|
||||
if (i == 0)
|
||||
first_prio = prio;
|
||||
else if (first_prio < 0 && first_prio != prio)
|
||||
break;
|
||||
add_ip_config_data (self, &servers, data);
|
||||
}
|
||||
c_list_for_each_entry (ip_data, ip_config_lst_head, ip_config_lst)
|
||||
add_ip_config (self, &servers, ip_data);
|
||||
}
|
||||
|
||||
g_clear_pointer (&priv->set_server_ex_args, g_variant_unref);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -26,11 +26,14 @@
|
|||
|
||||
#include "nm-ip4-config.h"
|
||||
#include "nm-ip6-config.h"
|
||||
#include "nm-setting-connection.h"
|
||||
|
||||
typedef enum {
|
||||
NM_DNS_IP_CONFIG_TYPE_REMOVED = -1,
|
||||
|
||||
NM_DNS_IP_CONFIG_TYPE_DEFAULT = 0,
|
||||
NM_DNS_IP_CONFIG_TYPE_BEST_DEVICE,
|
||||
NM_DNS_IP_CONFIG_TYPE_VPN
|
||||
NM_DNS_IP_CONFIG_TYPE_VPN,
|
||||
} NMDnsIPConfigType;
|
||||
|
||||
enum {
|
||||
|
|
@ -38,12 +41,27 @@ enum {
|
|||
NM_DNS_PRIORITY_DEFAULT_VPN = 50,
|
||||
};
|
||||
|
||||
struct _NMDnsConfigData;
|
||||
struct _NMDnsManager;
|
||||
|
||||
typedef struct {
|
||||
gpointer config;
|
||||
NMDnsIPConfigType type;
|
||||
char *iface;
|
||||
struct _NMDnsConfigData *data;
|
||||
NMIPConfig *ip_config;
|
||||
CList data_lst;
|
||||
CList ip_config_lst;
|
||||
NMDnsIPConfigType ip_config_type;
|
||||
struct {
|
||||
const char **search;
|
||||
char **reverse;
|
||||
} domains;
|
||||
} NMDnsIPConfigData;
|
||||
|
||||
typedef struct _NMDnsConfigData {
|
||||
struct _NMDnsManager *self;
|
||||
CList data_lst_head;
|
||||
int ifindex;
|
||||
} NMDnsConfigData;
|
||||
|
||||
#define NM_TYPE_DNS_MANAGER (nm_dns_manager_get_type ())
|
||||
#define NM_DNS_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), NM_TYPE_DNS_MANAGER, NMDnsManager))
|
||||
#define NM_DNS_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), NM_TYPE_DNS_MANAGER, NMDnsManagerClass))
|
||||
|
|
@ -70,12 +88,9 @@ NMDnsManager * nm_dns_manager_get (void);
|
|||
void nm_dns_manager_begin_updates (NMDnsManager *self, const char *func);
|
||||
void nm_dns_manager_end_updates (NMDnsManager *self, const char *func);
|
||||
|
||||
gboolean nm_dns_manager_add_ip_config (NMDnsManager *self,
|
||||
const char *iface,
|
||||
gpointer config,
|
||||
NMDnsIPConfigType cfg_type);
|
||||
|
||||
gboolean nm_dns_manager_remove_ip_config (NMDnsManager *self, gpointer config);
|
||||
gboolean nm_dns_manager_set_ip_config (NMDnsManager *self,
|
||||
NMIPConfig *ip_config,
|
||||
NMDnsIPConfigType ip_config_type);
|
||||
|
||||
void nm_dns_manager_set_initial_hostname (NMDnsManager *self,
|
||||
const char *hostname);
|
||||
|
|
|
|||
|
|
@ -77,15 +77,15 @@ G_DEFINE_TYPE_EXTENDED (NMDnsPlugin, nm_dns_plugin, G_TYPE_OBJECT, G_TYPE_FLAG_A
|
|||
|
||||
gboolean
|
||||
nm_dns_plugin_update (NMDnsPlugin *self,
|
||||
const GPtrArray *configs,
|
||||
const NMGlobalDnsConfig *global_config,
|
||||
const CList *ip_config_lst_head,
|
||||
const char *hostname)
|
||||
{
|
||||
g_return_val_if_fail (NM_DNS_PLUGIN_GET_CLASS (self)->update != NULL, FALSE);
|
||||
|
||||
return NM_DNS_PLUGIN_GET_CLASS (self)->update (self,
|
||||
configs,
|
||||
global_config,
|
||||
ip_config_lst_head,
|
||||
hostname);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -50,8 +50,8 @@ typedef struct {
|
|||
* configuration.
|
||||
*/
|
||||
gboolean (*update) (NMDnsPlugin *self,
|
||||
const GPtrArray *configs,
|
||||
const NMGlobalDnsConfig *global_config,
|
||||
const CList *ip_config_lst_head,
|
||||
const char *hostname);
|
||||
|
||||
/* Subclasses should override and return TRUE if they start a local
|
||||
|
|
@ -80,8 +80,8 @@ gboolean nm_dns_plugin_is_caching (NMDnsPlugin *self);
|
|||
const char *nm_dns_plugin_get_name (NMDnsPlugin *self);
|
||||
|
||||
gboolean nm_dns_plugin_update (NMDnsPlugin *self,
|
||||
const GPtrArray *configs,
|
||||
const NMGlobalDnsConfig *global_config,
|
||||
const CList *ip_config_lst_head,
|
||||
const char *hostname);
|
||||
|
||||
void nm_dns_plugin_stop (NMDnsPlugin *self);
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
#include <sys/stat.h>
|
||||
#include <linux/if.h>
|
||||
|
||||
#include "nm-utils/nm-c-list.h"
|
||||
#include "nm-core-internal.h"
|
||||
#include "platform/nm-platform.h"
|
||||
#include "nm-utils.h"
|
||||
|
|
@ -38,6 +39,7 @@
|
|||
#include "nm-ip6-config.h"
|
||||
#include "nm-bus-manager.h"
|
||||
#include "nm-manager.h"
|
||||
#include "nm-setting-connection.h"
|
||||
#include "devices/nm-device.h"
|
||||
#include "NetworkManagerUtils.h"
|
||||
|
||||
|
|
@ -48,17 +50,23 @@
|
|||
|
||||
typedef struct {
|
||||
int ifindex;
|
||||
GList *configs;
|
||||
CList configs_lst_head;
|
||||
} InterfaceConfig;
|
||||
|
||||
typedef struct {
|
||||
CList request_queue_lst;
|
||||
const char *operation;
|
||||
GVariant *argument;
|
||||
} RequestItem;
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
typedef struct {
|
||||
GDBusProxy *resolve;
|
||||
GCancellable *init_cancellable;
|
||||
GCancellable *update_cancellable;
|
||||
GQueue dns_updates;
|
||||
GQueue domain_updates;
|
||||
GCancellable *mdns_cancellable;
|
||||
CList request_queue_lst_head;
|
||||
} NMDnsSystemdResolvedPrivate;
|
||||
|
||||
struct _NMDnsSystemdResolved {
|
||||
|
|
@ -81,6 +89,36 @@ G_DEFINE_TYPE (NMDnsSystemdResolved, nm_dns_systemd_resolved, NM_TYPE_DNS_PLUGIN
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
static void
|
||||
_request_item_free (RequestItem *request_item)
|
||||
{
|
||||
c_list_unlink_stale (&request_item->request_queue_lst);
|
||||
g_variant_unref (request_item->argument);
|
||||
g_slice_free (RequestItem, request_item);
|
||||
}
|
||||
|
||||
static void
|
||||
_request_item_append (CList *request_queue_lst_head,
|
||||
const char *operation,
|
||||
GVariant *argument)
|
||||
{
|
||||
RequestItem *request_item;
|
||||
|
||||
request_item = g_slice_new (RequestItem);
|
||||
request_item->operation = operation;
|
||||
request_item->argument = g_variant_ref_sink (argument);
|
||||
c_list_link_tail (request_queue_lst_head, &request_item->request_queue_lst);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static void
|
||||
_interface_config_free (InterfaceConfig *config)
|
||||
{
|
||||
nm_c_list_elem_free_all (&config->configs_lst_head, NULL);
|
||||
g_slice_free (InterfaceConfig, config);
|
||||
}
|
||||
|
||||
static void
|
||||
call_done (GObject *source, GAsyncResult *r, gpointer user_data)
|
||||
{
|
||||
|
|
@ -99,113 +137,40 @@ call_done (GObject *source, GAsyncResult *r, gpointer user_data)
|
|||
}
|
||||
}
|
||||
|
||||
static void
|
||||
add_interface_configuration (NMDnsSystemdResolved *self,
|
||||
GArray *interfaces,
|
||||
const NMDnsIPConfigData *data,
|
||||
gboolean skip)
|
||||
{
|
||||
int i;
|
||||
InterfaceConfig *ic = NULL;
|
||||
int ifindex;
|
||||
|
||||
if (NM_IS_IP4_CONFIG (data->config))
|
||||
ifindex = nm_ip4_config_get_ifindex (data->config);
|
||||
else if (NM_IS_IP6_CONFIG (data->config))
|
||||
ifindex = nm_ip6_config_get_ifindex (data->config);
|
||||
else
|
||||
g_return_if_reached ();
|
||||
|
||||
for (i = 0; i < interfaces->len; i++) {
|
||||
InterfaceConfig *tic = &g_array_index (interfaces, InterfaceConfig, i);
|
||||
if (ifindex == tic->ifindex) {
|
||||
ic = tic;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!ic) {
|
||||
g_array_set_size (interfaces, interfaces->len + 1);
|
||||
ic = &g_array_index (interfaces, InterfaceConfig,
|
||||
interfaces->len - 1);
|
||||
ic->ifindex = ifindex;
|
||||
}
|
||||
|
||||
if (!skip)
|
||||
ic->configs = g_list_append (ic->configs, data->config);
|
||||
}
|
||||
|
||||
static void
|
||||
update_add_ip_config (NMDnsSystemdResolved *self,
|
||||
GVariantBuilder *dns,
|
||||
GVariantBuilder *domains,
|
||||
gpointer config)
|
||||
NMDnsIPConfigData *data)
|
||||
{
|
||||
int addr_family;
|
||||
gsize addr_size;
|
||||
guint i, n;
|
||||
gboolean route_only;
|
||||
|
||||
if (NM_IS_IP4_CONFIG (config))
|
||||
addr_family = AF_INET;
|
||||
else if (NM_IS_IP6_CONFIG (config))
|
||||
addr_family = AF_INET6;
|
||||
else
|
||||
g_return_if_reached ();
|
||||
gboolean is_routing;
|
||||
const char **iter;
|
||||
const char *domain;
|
||||
|
||||
addr_family = nm_ip_config_get_addr_family (data->ip_config);
|
||||
addr_size = nm_utils_addr_family_to_size (addr_family);
|
||||
|
||||
n = addr_family == AF_INET
|
||||
? nm_ip4_config_get_num_nameservers (config)
|
||||
: nm_ip6_config_get_num_nameservers (config);
|
||||
if (!data->domains.search || !data->domains.search[0])
|
||||
return;
|
||||
|
||||
n = nm_ip_config_get_num_nameservers (data->ip_config);
|
||||
for (i = 0 ; i < n; i++) {
|
||||
in_addr_t ns4;
|
||||
gconstpointer ns;
|
||||
|
||||
if (addr_family == AF_INET) {
|
||||
ns4 = nm_ip4_config_get_nameserver (config, i);
|
||||
ns = &ns4;
|
||||
} else
|
||||
ns = nm_ip6_config_get_nameserver (config, i);
|
||||
|
||||
g_variant_builder_open (dns, G_VARIANT_TYPE ("(iay)"));
|
||||
g_variant_builder_add (dns, "i", addr_family);
|
||||
g_variant_builder_add_value (dns,
|
||||
g_variant_new_fixed_array (G_VARIANT_TYPE_BYTE,
|
||||
ns,
|
||||
nm_ip_config_get_nameserver (data->ip_config, i),
|
||||
addr_size,
|
||||
1));
|
||||
g_variant_builder_close (dns);
|
||||
}
|
||||
|
||||
/* If this link is never the default (e.g. only used for resources on this
|
||||
* network) add a routing domain. */
|
||||
route_only = addr_family == AF_INET
|
||||
? !nm_ip4_config_best_default_route_get (config)
|
||||
: !nm_ip6_config_best_default_route_get (config);
|
||||
|
||||
n = addr_family == AF_INET
|
||||
? nm_ip4_config_get_num_searches (config)
|
||||
: nm_ip6_config_get_num_searches (config);
|
||||
if (n > 0) {
|
||||
for (i = 0; i < n; i++) {
|
||||
g_variant_builder_add (domains, "(sb)",
|
||||
addr_family == AF_INET
|
||||
? nm_ip4_config_get_search (config, i)
|
||||
: nm_ip6_config_get_search (config, i),
|
||||
route_only);
|
||||
}
|
||||
} else {
|
||||
n = addr_family == AF_INET
|
||||
? nm_ip4_config_get_num_domains (config)
|
||||
: nm_ip6_config_get_num_domains (config);
|
||||
for (i = 0; i < n; i++) {
|
||||
g_variant_builder_add (domains, "(sb)",
|
||||
addr_family == AF_INET
|
||||
? nm_ip4_config_get_domain (config, i)
|
||||
: nm_ip6_config_get_domain (config, i),
|
||||
route_only);
|
||||
}
|
||||
for (iter = data->domains.search; *iter; iter++) {
|
||||
domain = nm_utils_parse_dns_domain (*iter, &is_routing);
|
||||
g_variant_builder_add (domains, "(sb)", domain[0] ? domain : ".", is_routing);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -213,13 +178,13 @@ static void
|
|||
free_pending_updates (NMDnsSystemdResolved *self)
|
||||
{
|
||||
NMDnsSystemdResolvedPrivate *priv = NM_DNS_SYSTEMD_RESOLVED_GET_PRIVATE (self);
|
||||
GVariant *v;
|
||||
RequestItem *request_item, *request_item_safe;
|
||||
|
||||
while ((v = g_queue_pop_head (&priv->dns_updates)) != NULL)
|
||||
g_variant_unref (v);
|
||||
|
||||
while ((v = g_queue_pop_head (&priv->domain_updates)) != NULL)
|
||||
g_variant_unref (v);
|
||||
c_list_for_each_entry_safe (request_item,
|
||||
request_item_safe,
|
||||
&priv->request_queue_lst_head,
|
||||
request_queue_lst)
|
||||
_request_item_free (request_item);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -227,7 +192,9 @@ prepare_one_interface (NMDnsSystemdResolved *self, InterfaceConfig *ic)
|
|||
{
|
||||
NMDnsSystemdResolvedPrivate *priv = NM_DNS_SYSTEMD_RESOLVED_GET_PRIVATE (self);
|
||||
GVariantBuilder dns, domains;
|
||||
GList *l;
|
||||
NMCListElem *elem;
|
||||
NMSettingConnectionMdns mdns = NM_SETTING_CONNECTION_MDNS_DEFAULT;
|
||||
const char *mdns_arg = NULL;
|
||||
|
||||
g_variant_builder_init (&dns, G_VARIANT_TYPE ("(ia(iay))"));
|
||||
g_variant_builder_add (&dns, "i", ic->ifindex);
|
||||
|
|
@ -237,23 +204,51 @@ prepare_one_interface (NMDnsSystemdResolved *self, InterfaceConfig *ic)
|
|||
g_variant_builder_add (&domains, "i", ic->ifindex);
|
||||
g_variant_builder_open (&domains, G_VARIANT_TYPE ("a(sb)"));
|
||||
|
||||
for (l = ic->configs; l; l = l->next)
|
||||
update_add_ip_config (self, &dns, &domains, l->data);
|
||||
c_list_for_each_entry (elem, &ic->configs_lst_head, lst) {
|
||||
NMDnsIPConfigData *data = elem->data;
|
||||
NMIPConfig *ip_config = data->ip_config;
|
||||
|
||||
update_add_ip_config (self, &dns, &domains, data);
|
||||
|
||||
if (NM_IS_IP4_CONFIG (ip_config))
|
||||
mdns = NM_MAX (mdns, nm_ip4_config_mdns_get (NM_IP4_CONFIG (ip_config)));
|
||||
}
|
||||
|
||||
g_variant_builder_close (&dns);
|
||||
g_variant_builder_close (&domains);
|
||||
|
||||
g_queue_push_tail (&priv->dns_updates,
|
||||
g_variant_ref_sink (g_variant_builder_end (&dns)));
|
||||
g_queue_push_tail (&priv->domain_updates,
|
||||
g_variant_ref_sink (g_variant_builder_end (&domains)));
|
||||
switch (mdns) {
|
||||
case NM_SETTING_CONNECTION_MDNS_NO:
|
||||
mdns_arg = "no";
|
||||
break;
|
||||
case NM_SETTING_CONNECTION_MDNS_RESOLVE:
|
||||
mdns_arg = "resolve";
|
||||
break;
|
||||
case NM_SETTING_CONNECTION_MDNS_YES:
|
||||
mdns_arg = "yes";
|
||||
break;
|
||||
case NM_SETTING_CONNECTION_MDNS_DEFAULT:
|
||||
mdns_arg = "";
|
||||
break;
|
||||
}
|
||||
nm_assert (mdns_arg);
|
||||
|
||||
_request_item_append (&priv->request_queue_lst_head,
|
||||
"SetLinkDNS",
|
||||
g_variant_builder_end (&dns));
|
||||
_request_item_append (&priv->request_queue_lst_head,
|
||||
"SetLinkDomains",
|
||||
g_variant_builder_end (&domains));
|
||||
_request_item_append (&priv->request_queue_lst_head,
|
||||
"SetLinkMulticastDNS",
|
||||
g_variant_new ("(is)", ic->ifindex, mdns_arg ?: ""));
|
||||
}
|
||||
|
||||
static void
|
||||
send_updates (NMDnsSystemdResolved *self)
|
||||
{
|
||||
NMDnsSystemdResolvedPrivate *priv = NM_DNS_SYSTEMD_RESOLVED_GET_PRIVATE (self);
|
||||
GVariant *v;
|
||||
RequestItem *request_item, *request_item_safe;
|
||||
|
||||
nm_clear_g_cancellable (&priv->update_cancellable);
|
||||
|
||||
|
|
@ -262,55 +257,73 @@ send_updates (NMDnsSystemdResolved *self)
|
|||
|
||||
priv->update_cancellable = g_cancellable_new ();
|
||||
|
||||
while ((v = g_queue_pop_head (&priv->dns_updates)) != NULL) {
|
||||
g_dbus_proxy_call (priv->resolve, "SetLinkDNS", v,
|
||||
c_list_for_each_entry_safe (request_item,
|
||||
request_item_safe,
|
||||
&priv->request_queue_lst_head,
|
||||
request_queue_lst) {
|
||||
g_dbus_proxy_call (priv->resolve,
|
||||
request_item->operation,
|
||||
request_item->argument,
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1, priv->update_cancellable, call_done, self);
|
||||
g_variant_unref (v);
|
||||
}
|
||||
|
||||
while ((v = g_queue_pop_head (&priv->domain_updates)) != NULL) {
|
||||
g_dbus_proxy_call (priv->resolve, "SetLinkDomains", v,
|
||||
G_DBUS_CALL_FLAGS_NONE,
|
||||
-1, priv->update_cancellable, call_done, self);
|
||||
g_variant_unref (v);
|
||||
-1,
|
||||
priv->update_cancellable,
|
||||
call_done,
|
||||
self);
|
||||
_request_item_free (request_item);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
update (NMDnsPlugin *plugin,
|
||||
const GPtrArray *configs,
|
||||
const NMGlobalDnsConfig *global_config,
|
||||
const CList *ip_config_lst_head,
|
||||
const char *hostname)
|
||||
{
|
||||
NMDnsSystemdResolved *self = NM_DNS_SYSTEMD_RESOLVED (plugin);
|
||||
GArray *interfaces = g_array_new (TRUE, TRUE, sizeof (InterfaceConfig));
|
||||
gs_unref_hashtable GHashTable *interfaces = NULL;
|
||||
gs_free gpointer *interfaces_keys = NULL;
|
||||
guint interfaces_len;
|
||||
guint i;
|
||||
int prio, first_prio = 0;
|
||||
NMDnsIPConfigData *ip_data;
|
||||
|
||||
for (i = 0; i < configs->len; i++) {
|
||||
const NMDnsIPConfigData *data = configs->pdata[i];
|
||||
gboolean skip = FALSE;
|
||||
interfaces = g_hash_table_new_full (nm_direct_hash, NULL,
|
||||
NULL, (GDestroyNotify) _interface_config_free);
|
||||
|
||||
prio = nm_ip_config_get_dns_priority (data->config);
|
||||
if (i == 0)
|
||||
first_prio = prio;
|
||||
else if (first_prio < 0 && first_prio != prio)
|
||||
skip = TRUE;
|
||||
add_interface_configuration (self, interfaces, data, skip);
|
||||
c_list_for_each_entry (ip_data, ip_config_lst_head, ip_config_lst) {
|
||||
InterfaceConfig *ic = NULL;
|
||||
int ifindex;
|
||||
|
||||
ifindex = ip_data->data->ifindex;
|
||||
nm_assert (ifindex == nm_ip_config_get_ifindex (ip_data->ip_config));
|
||||
|
||||
ic = g_hash_table_lookup (interfaces, GINT_TO_POINTER (ifindex));
|
||||
if (!ic) {
|
||||
ic = g_slice_new (InterfaceConfig);
|
||||
ic->ifindex = ifindex;
|
||||
c_list_init (&ic->configs_lst_head);
|
||||
g_hash_table_insert (interfaces, GINT_TO_POINTER (ifindex), ic);
|
||||
}
|
||||
|
||||
c_list_link_tail (&ic->configs_lst_head,
|
||||
&nm_c_list_elem_new_stale (ip_data)->lst);
|
||||
}
|
||||
|
||||
free_pending_updates (self);
|
||||
|
||||
for (i = 0; i < interfaces->len; i++) {
|
||||
InterfaceConfig *ic = &g_array_index (interfaces, InterfaceConfig, i);
|
||||
interfaces_keys = g_hash_table_get_keys_as_array (interfaces, &interfaces_len);
|
||||
if (interfaces_len > 1) {
|
||||
g_qsort_with_data (interfaces_keys,
|
||||
interfaces_len,
|
||||
sizeof (gpointer),
|
||||
nm_cmp_int2ptr_p_with_data,
|
||||
NULL);
|
||||
}
|
||||
for (i = 0; i < interfaces_len; i++) {
|
||||
InterfaceConfig *ic = g_hash_table_lookup (interfaces, GINT_TO_POINTER (interfaces_keys[i]));
|
||||
|
||||
prepare_one_interface (self, ic);
|
||||
g_list_free (ic->configs);
|
||||
}
|
||||
|
||||
g_array_free (interfaces, TRUE);
|
||||
|
||||
send_updates (self);
|
||||
|
||||
return TRUE;
|
||||
|
|
@ -366,8 +379,7 @@ nm_dns_systemd_resolved_init (NMDnsSystemdResolved *self)
|
|||
NMBusManager *dbus_mgr;
|
||||
GDBusConnection *connection;
|
||||
|
||||
g_queue_init (&priv->dns_updates);
|
||||
g_queue_init (&priv->domain_updates);
|
||||
c_list_init (&priv->request_queue_lst_head);
|
||||
|
||||
dbus_mgr = nm_bus_manager_get ();
|
||||
g_return_if_fail (dbus_mgr);
|
||||
|
|
@ -404,6 +416,7 @@ dispose (GObject *object)
|
|||
g_clear_object (&priv->resolve);
|
||||
nm_clear_g_cancellable (&priv->init_cancellable);
|
||||
nm_clear_g_cancellable (&priv->update_cancellable);
|
||||
nm_clear_g_cancellable (&priv->mdns_cancellable);
|
||||
|
||||
G_OBJECT_CLASS (nm_dns_systemd_resolved_parent_class)->dispose (object);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -39,8 +39,8 @@ G_DEFINE_TYPE (NMDnsUnbound, nm_dns_unbound, NM_TYPE_DNS_PLUGIN)
|
|||
|
||||
static gboolean
|
||||
update (NMDnsPlugin *plugin,
|
||||
const GPtrArray *configs,
|
||||
const NMGlobalDnsConfig *global_config,
|
||||
const CList *ip_config_lst_head,
|
||||
const char *hostname)
|
||||
{
|
||||
char *argv[] = { DNSSEC_TRIGGER_SCRIPT, "--async", "--update", NULL };
|
||||
|
|
|
|||
|
|
@ -4329,6 +4329,21 @@ nm_utils_format_con_diff_for_audit (GHashTable *diff)
|
|||
return g_string_free (str, FALSE);
|
||||
}
|
||||
|
||||
const char *
|
||||
nm_utils_parse_dns_domain (const char *domain, gboolean *is_routing)
|
||||
{
|
||||
g_return_val_if_fail (domain, NULL);
|
||||
g_return_val_if_fail (domain[0], NULL);
|
||||
|
||||
if (domain[0] == '~') {
|
||||
domain++;
|
||||
NM_SET_OUT (is_routing, TRUE);
|
||||
} else
|
||||
NM_SET_OUT (is_routing, FALSE);
|
||||
|
||||
return domain;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
NM_UTILS_ENUM2STR_DEFINE (nm_icmpv6_router_pref_to_string, NMIcmpv6RouterPref,
|
||||
|
|
|
|||
|
|
@ -450,4 +450,6 @@ const char *nm_activation_type_to_string (NMActivationType activation_type);
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
const char *nm_utils_parse_dns_domain (const char *domain, gboolean *is_routing);
|
||||
|
||||
#endif /* __NM_CORE_UTILS_H__ */
|
||||
|
|
|
|||
|
|
@ -293,6 +293,7 @@ typedef struct {
|
|||
int ifindex;
|
||||
NMIPConfigSource mtu_source;
|
||||
gint dns_priority;
|
||||
NMSettingConnectionMdns mdns;
|
||||
GArray *nameservers;
|
||||
GPtrArray *domains;
|
||||
GPtrArray *searches;
|
||||
|
|
@ -893,6 +894,7 @@ _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)
|
||||
{
|
||||
|
|
@ -1012,6 +1014,8 @@ 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));
|
||||
}
|
||||
|
||||
|
|
@ -1227,6 +1231,11 @@ 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));
|
||||
}
|
||||
|
||||
|
|
@ -1463,6 +1472,10 @@ 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));
|
||||
}
|
||||
|
||||
|
|
@ -1550,6 +1563,7 @@ nm_ip4_config_intersect (NMIP4Config *dst,
|
|||
/* ignore dns options */
|
||||
/* ignore NIS */
|
||||
/* ignore WINS */
|
||||
/* ignore mdns */
|
||||
|
||||
g_object_thaw_notify (G_OBJECT (dst));
|
||||
}
|
||||
|
|
@ -1779,6 +1793,8 @@ 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);
|
||||
|
|
@ -2270,6 +2286,31 @@ _nm_ip4_config_get_nameserver (const NMIP4Config *self, guint i)
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
gboolean
|
||||
_nm_ip_config_check_and_add_domain (GPtrArray *array, const char *domain)
|
||||
{
|
||||
char *copy = NULL;
|
||||
size_t len;
|
||||
|
||||
g_return_val_if_fail (domain, FALSE);
|
||||
g_return_val_if_fail (domain[0] != '\0', FALSE);
|
||||
|
||||
if (domain[0] == '.' || strstr (domain, ".."))
|
||||
return FALSE;
|
||||
|
||||
len = strlen (domain);
|
||||
if (domain[len - 1] == '.')
|
||||
domain = copy = g_strndup (domain, len - 1);
|
||||
|
||||
if (nm_utils_strv_find_first ((char **) array->pdata, array->len, domain) >= 0) {
|
||||
g_free (copy);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
g_ptr_array_add (array, copy ?: g_strdup (domain));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
nm_ip4_config_reset_domains (NMIP4Config *self)
|
||||
{
|
||||
|
|
@ -2285,17 +2326,9 @@ void
|
|||
nm_ip4_config_add_domain (NMIP4Config *self, const char *domain)
|
||||
{
|
||||
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
||||
int i;
|
||||
|
||||
g_return_if_fail (domain != NULL);
|
||||
g_return_if_fail (domain[0] != '\0');
|
||||
|
||||
for (i = 0; i < priv->domains->len; i++)
|
||||
if (!g_strcmp0 (g_ptr_array_index (priv->domains, i), domain))
|
||||
return;
|
||||
|
||||
g_ptr_array_add (priv->domains, g_strdup (domain));
|
||||
_notify (self, PROP_DOMAINS);
|
||||
if (_nm_ip_config_check_and_add_domain (priv->domains, domain))
|
||||
_notify (self, PROP_DOMAINS);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -2339,35 +2372,12 @@ nm_ip4_config_reset_searches (NMIP4Config *self)
|
|||
}
|
||||
|
||||
void
|
||||
nm_ip4_config_add_search (NMIP4Config *self, const char *new)
|
||||
nm_ip4_config_add_search (NMIP4Config *self, const char *search)
|
||||
{
|
||||
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (self);
|
||||
char *search;
|
||||
size_t len;
|
||||
|
||||
g_return_if_fail (new != NULL);
|
||||
g_return_if_fail (new[0] != '\0');
|
||||
|
||||
search = g_strdup (new);
|
||||
|
||||
/* Remove trailing dot as it has no effect */
|
||||
len = strlen (search);
|
||||
if (search[len - 1] == '.')
|
||||
search[len - 1] = 0;
|
||||
|
||||
if (!search[0]) {
|
||||
g_free (search);
|
||||
return;
|
||||
}
|
||||
|
||||
if (nm_utils_strv_find_first ((char **) priv->searches->pdata,
|
||||
priv->searches->len, search) >= 0) {
|
||||
g_free (search);
|
||||
return;
|
||||
}
|
||||
|
||||
g_ptr_array_add (priv->searches, search);
|
||||
_notify (self, PROP_SEARCHES);
|
||||
if (_nm_ip_config_check_and_add_domain (priv->searches, search))
|
||||
_notify (self, PROP_SEARCHES);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -2456,6 +2466,21 @@ 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)
|
||||
{
|
||||
|
|
@ -3065,6 +3090,7 @@ 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);
|
||||
|
|
|
|||
|
|
@ -21,6 +21,8 @@
|
|||
#ifndef __NETWORKMANAGER_IP4_CONFIG_H__
|
||||
#define __NETWORKMANAGER_IP4_CONFIG_H__
|
||||
|
||||
#include "nm-setting-connection.h"
|
||||
|
||||
#include "nm-exported-object.h"
|
||||
#include "nm-setting-ip4-config.h"
|
||||
|
||||
|
|
@ -171,6 +173,7 @@ gboolean nm_ip4_config_commit (const NMIP4Config *self,
|
|||
|
||||
void nm_ip4_config_merge_setting (NMIP4Config *self,
|
||||
NMSettingIPConfig *setting,
|
||||
NMSettingConnectionMdns mdns,
|
||||
guint32 route_table,
|
||||
guint32 route_metric);
|
||||
NMSetting *nm_ip4_config_create_setting (const NMIP4Config *self);
|
||||
|
|
@ -194,6 +197,10 @@ const NMPObject *_nm_ip4_config_best_default_route_find (const NMIP4Config *self
|
|||
|
||||
in_addr_t nmtst_ip4_config_get_gateway (NMIP4Config *config);
|
||||
|
||||
NMSettingConnectionMdns nm_ip4_config_mdns_get (const NMIP4Config *self);
|
||||
void nm_ip4_config_mdns_set (NMIP4Config *self,
|
||||
NMSettingConnectionMdns mdns);
|
||||
|
||||
const NMDedupMultiHeadEntry *nm_ip4_config_lookup_addresses (const NMIP4Config *self);
|
||||
void nm_ip4_config_reset_addresses (NMIP4Config *self);
|
||||
void nm_ip4_config_add_address (NMIP4Config *self, const NMPlatformIP4Address *address);
|
||||
|
|
@ -273,6 +280,8 @@ gboolean nm_ip4_config_nmpobj_remove (NMIP4Config *self,
|
|||
void nm_ip4_config_hash (const NMIP4Config *self, GChecksum *sum, gboolean dns_only);
|
||||
gboolean nm_ip4_config_equal (const NMIP4Config *a, const NMIP4Config *b);
|
||||
|
||||
gboolean _nm_ip_config_check_and_add_domain (GPtrArray *array, const char *domain);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#include "nm-ip6-config.h"
|
||||
|
|
@ -338,7 +347,7 @@ nm_ip_config_get_addr_family (const NMIPConfig *config)
|
|||
g_return_val_if_reached (AF_UNSPEC);
|
||||
}
|
||||
|
||||
#define _NM_IP_CONFIG_DISPATCH(config, v4_func, v6_func, dflt, ...) \
|
||||
#define _NM_IP_CONFIG_DISPATCH(config, v4_func, v6_func, ...) \
|
||||
G_STMT_START { \
|
||||
gconstpointer _config = (config); \
|
||||
\
|
||||
|
|
@ -350,58 +359,88 @@ nm_ip_config_get_addr_family (const NMIPConfig *config)
|
|||
} \
|
||||
} G_STMT_END
|
||||
|
||||
#define _NM_IP_CONFIG_DISPATCH_VOID(config, v4_func, v6_func, ...) \
|
||||
G_STMT_START { \
|
||||
gconstpointer _config = (config); \
|
||||
\
|
||||
if (NM_IS_IP4_CONFIG (_config)) { \
|
||||
v4_func ((NMIP4Config *) _config, ##__VA_ARGS__); \
|
||||
} else { \
|
||||
nm_assert (NM_IS_IP6_CONFIG (_config)); \
|
||||
v6_func ((NMIP6Config *) _config, ##__VA_ARGS__); \
|
||||
} \
|
||||
} G_STMT_END
|
||||
|
||||
static inline int
|
||||
nm_ip_config_get_ifindex (const NMIPConfig *self)
|
||||
{
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_ifindex, nm_ip6_config_get_ifindex);
|
||||
}
|
||||
|
||||
static inline void
|
||||
nm_ip_config_hash (const NMIPConfig *self, GChecksum *sum, gboolean dns_only)
|
||||
{
|
||||
_NM_IP_CONFIG_DISPATCH_VOID (self, nm_ip4_config_hash, nm_ip6_config_hash, sum, dns_only);
|
||||
}
|
||||
|
||||
static inline int
|
||||
nm_ip_config_get_dns_priority (const NMIPConfig *self)
|
||||
{
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_dns_priority, nm_ip6_config_get_dns_priority, 0);
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_dns_priority, nm_ip6_config_get_dns_priority);
|
||||
}
|
||||
|
||||
static inline guint
|
||||
nm_ip_config_get_num_nameservers (const NMIPConfig *self)
|
||||
{
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_num_nameservers, nm_ip6_config_get_num_nameservers, 0);
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_num_nameservers, nm_ip6_config_get_num_nameservers);
|
||||
}
|
||||
|
||||
static inline gconstpointer
|
||||
nm_ip_config_get_nameserver (const NMIPConfig *self, guint i)
|
||||
{
|
||||
_NM_IP_CONFIG_DISPATCH (self, _nm_ip4_config_get_nameserver, nm_ip6_config_get_nameserver, 0, i);
|
||||
_NM_IP_CONFIG_DISPATCH (self, _nm_ip4_config_get_nameserver, nm_ip6_config_get_nameserver, i);
|
||||
}
|
||||
|
||||
static inline guint
|
||||
nm_ip_config_get_num_domains (const NMIPConfig *self)
|
||||
{
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_num_domains, nm_ip6_config_get_num_domains, 0);
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_num_domains, nm_ip6_config_get_num_domains);
|
||||
}
|
||||
|
||||
static inline const char *
|
||||
nm_ip_config_get_domain (const NMIPConfig *self, guint i)
|
||||
{
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_domain, nm_ip6_config_get_domain, NULL, i);
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_domain, nm_ip6_config_get_domain, i);
|
||||
}
|
||||
|
||||
static inline guint
|
||||
nm_ip_config_get_num_searches (const NMIPConfig *self)
|
||||
{
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_num_searches, nm_ip6_config_get_num_searches, 0);
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_num_searches, nm_ip6_config_get_num_searches);
|
||||
}
|
||||
|
||||
static inline const char *
|
||||
nm_ip_config_get_search (const NMIPConfig *self, guint i)
|
||||
{
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_search, nm_ip6_config_get_search, NULL, i);
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_search, nm_ip6_config_get_search, i);
|
||||
}
|
||||
|
||||
static inline guint
|
||||
nm_ip_config_get_num_dns_options (const NMIPConfig *self)
|
||||
{
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_num_dns_options, nm_ip6_config_get_num_dns_options, 0);
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_num_dns_options, nm_ip6_config_get_num_dns_options);
|
||||
}
|
||||
|
||||
static inline const char *
|
||||
nm_ip_config_get_dns_option (const NMIPConfig *self, guint i)
|
||||
{
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_dns_option, nm_ip6_config_get_dns_option, NULL, i);
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_get_dns_option, nm_ip6_config_get_dns_option, i);
|
||||
}
|
||||
|
||||
static inline const NMPObject *
|
||||
nm_ip_config_best_default_route_get (const NMIPConfig *self)
|
||||
{
|
||||
_NM_IP_CONFIG_DISPATCH (self, nm_ip4_config_best_default_route_get, nm_ip6_config_best_default_route_get);
|
||||
}
|
||||
|
||||
#endif /* __NETWORKMANAGER_IP4_CONFIG_H__ */
|
||||
|
|
|
|||
|
|
@ -2054,17 +2054,9 @@ void
|
|||
nm_ip6_config_add_domain (NMIP6Config *self, const char *domain)
|
||||
{
|
||||
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (self);
|
||||
int i;
|
||||
|
||||
g_return_if_fail (domain != NULL);
|
||||
g_return_if_fail (domain[0] != '\0');
|
||||
|
||||
for (i = 0; i < priv->domains->len; i++)
|
||||
if (!g_strcmp0 (g_ptr_array_index (priv->domains, i), domain))
|
||||
return;
|
||||
|
||||
g_ptr_array_add (priv->domains, g_strdup (domain));
|
||||
_notify (self, PROP_DOMAINS);
|
||||
if (_nm_ip_config_check_and_add_domain (priv->domains, domain))
|
||||
_notify (self, PROP_DOMAINS);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -2108,35 +2100,12 @@ nm_ip6_config_reset_searches (NMIP6Config *self)
|
|||
}
|
||||
|
||||
void
|
||||
nm_ip6_config_add_search (NMIP6Config *self, const char *new)
|
||||
nm_ip6_config_add_search (NMIP6Config *self, const char *search)
|
||||
{
|
||||
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (self);
|
||||
char *search;
|
||||
size_t len;
|
||||
|
||||
g_return_if_fail (new != NULL);
|
||||
g_return_if_fail (new[0] != '\0');
|
||||
|
||||
search = g_strdup (new);
|
||||
|
||||
/* Remove trailing dot as it has no effect */
|
||||
len = strlen (search);
|
||||
if (search[len - 1] == '.')
|
||||
search[len - 1] = 0;
|
||||
|
||||
if (!search[0]) {
|
||||
g_free (search);
|
||||
return;
|
||||
}
|
||||
|
||||
if (nm_utils_strv_find_first ((char **) priv->searches->pdata,
|
||||
priv->searches->len, search) >= 0) {
|
||||
g_free (search);
|
||||
return;
|
||||
}
|
||||
|
||||
g_ptr_array_add (priv->searches, search);
|
||||
_notify (self, PROP_SEARCHES);
|
||||
if (_nm_ip_config_check_and_add_domain (priv->searches, search))
|
||||
_notify (self, PROP_SEARCHES);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
117
src/nm-policy.c
117
src/nm-policy.c
|
|
@ -1065,22 +1065,19 @@ update_ip_dns (NMPolicy *self, int addr_family)
|
|||
gpointer ip_config;
|
||||
const char *ip_iface = NULL;
|
||||
NMVpnConnection *vpn = NULL;
|
||||
NMDnsIPConfigType dns_type = NM_DNS_IP_CONFIG_TYPE_BEST_DEVICE;
|
||||
|
||||
nm_assert_addr_family (addr_family);
|
||||
|
||||
ip_config = get_best_ip_config (self, addr_family, &ip_iface, NULL, NULL, &vpn);
|
||||
if (ip_config) {
|
||||
if (vpn)
|
||||
dns_type = NM_DNS_IP_CONFIG_TYPE_VPN;
|
||||
|
||||
/* Tell the DNS manager this config is preferred by re-adding it with
|
||||
* a different IP config type.
|
||||
*/
|
||||
nm_dns_manager_add_ip_config (NM_POLICY_GET_PRIVATE (self)->dns_manager,
|
||||
ip_iface,
|
||||
nm_dns_manager_set_ip_config (NM_POLICY_GET_PRIVATE (self)->dns_manager,
|
||||
ip_config,
|
||||
dns_type);
|
||||
vpn
|
||||
? NM_DNS_IP_CONFIG_TYPE_VPN
|
||||
: NM_DNS_IP_CONFIG_TYPE_BEST_DEVICE);
|
||||
}
|
||||
|
||||
if (addr_family == AF_INET6)
|
||||
|
|
@ -1715,7 +1712,6 @@ device_state_changed (NMDevice *device,
|
|||
NMPolicy *self = _PRIV_TO_SELF (priv);
|
||||
NMActiveConnection *ac;
|
||||
NMSettingsConnection *connection = nm_device_get_settings_connection (device);
|
||||
const char *ip_iface = nm_device_get_ip_iface (device);
|
||||
NMIP4Config *ip4_config;
|
||||
NMIP6Config *ip6_config;
|
||||
NMSettingConnection *s_con = NULL;
|
||||
|
|
@ -1812,10 +1808,10 @@ device_state_changed (NMDevice *device,
|
|||
|
||||
ip4_config = nm_device_get_ip4_config (device);
|
||||
if (ip4_config)
|
||||
nm_dns_manager_add_ip_config (priv->dns_manager, ip_iface, ip4_config, NM_DNS_IP_CONFIG_TYPE_DEFAULT);
|
||||
nm_dns_manager_set_ip_config (priv->dns_manager, NM_IP_CONFIG_CAST (ip4_config), NM_DNS_IP_CONFIG_TYPE_DEFAULT);
|
||||
ip6_config = nm_device_get_ip6_config (device);
|
||||
if (ip6_config)
|
||||
nm_dns_manager_add_ip_config (priv->dns_manager, ip_iface, ip6_config, NM_DNS_IP_CONFIG_TYPE_DEFAULT);
|
||||
nm_dns_manager_set_ip_config (priv->dns_manager, NM_IP_CONFIG_CAST (ip6_config), NM_DNS_IP_CONFIG_TYPE_DEFAULT);
|
||||
|
||||
update_routing_and_dns (self, FALSE);
|
||||
|
||||
|
|
@ -1908,14 +1904,24 @@ device_state_changed (NMDevice *device,
|
|||
}
|
||||
|
||||
static void
|
||||
device_ip4_config_changed (NMDevice *device,
|
||||
NMIP4Config *new_config,
|
||||
NMIP4Config *old_config,
|
||||
gpointer user_data)
|
||||
device_ip_config_changed (NMDevice *device,
|
||||
NMIPConfig *new_config,
|
||||
NMIPConfig *old_config,
|
||||
gpointer user_data)
|
||||
{
|
||||
NMPolicyPrivate *priv = user_data;
|
||||
NMPolicy *self = _PRIV_TO_SELF (priv);
|
||||
const char *ip_iface = nm_device_get_ip_iface (device);
|
||||
int addr_family;
|
||||
|
||||
nm_assert (new_config || old_config);
|
||||
nm_assert (!new_config || NM_IS_IP_CONFIG (new_config));
|
||||
nm_assert (!old_config || NM_IS_IP_CONFIG (old_config));
|
||||
|
||||
if (new_config) {
|
||||
addr_family = nm_ip_config_get_addr_family (new_config);
|
||||
nm_assert (!old_config || addr_family == nm_ip_config_get_addr_family (old_config));
|
||||
} else
|
||||
addr_family = nm_ip_config_get_addr_family (old_config);
|
||||
|
||||
nm_dns_manager_begin_updates (priv->dns_manager, __func__);
|
||||
|
||||
|
|
@ -1926,54 +1932,24 @@ device_ip4_config_changed (NMDevice *device,
|
|||
*/
|
||||
if (nm_device_get_state (device) == NM_DEVICE_STATE_ACTIVATED) {
|
||||
if (old_config != new_config) {
|
||||
if (old_config)
|
||||
nm_dns_manager_remove_ip_config (priv->dns_manager, old_config);
|
||||
if (new_config)
|
||||
nm_dns_manager_add_ip_config (priv->dns_manager, ip_iface, new_config, NM_DNS_IP_CONFIG_TYPE_DEFAULT);
|
||||
nm_dns_manager_set_ip_config (priv->dns_manager, new_config, NM_DNS_IP_CONFIG_TYPE_DEFAULT);
|
||||
if (old_config)
|
||||
nm_dns_manager_set_ip_config (priv->dns_manager, old_config, NM_DNS_IP_CONFIG_TYPE_REMOVED);
|
||||
}
|
||||
update_ip_dns (self, AF_INET);
|
||||
update_ip4_routing (self, TRUE);
|
||||
update_system_hostname (self, "ip4 conf");
|
||||
update_ip_dns (self, addr_family);
|
||||
if (addr_family == AF_INET)
|
||||
update_ip4_routing (self, TRUE);
|
||||
else
|
||||
update_ip6_routing (self, TRUE);
|
||||
update_system_hostname (self,
|
||||
addr_family == AF_INET
|
||||
? "ip4 conf"
|
||||
: "ip6 conf");
|
||||
} else {
|
||||
/* Old configs get removed immediately */
|
||||
if (old_config)
|
||||
nm_dns_manager_remove_ip_config (priv->dns_manager, old_config);
|
||||
}
|
||||
|
||||
nm_dns_manager_end_updates (priv->dns_manager, __func__);
|
||||
}
|
||||
|
||||
static void
|
||||
device_ip6_config_changed (NMDevice *device,
|
||||
NMIP6Config *new_config,
|
||||
NMIP6Config *old_config,
|
||||
gpointer user_data)
|
||||
{
|
||||
NMPolicyPrivate *priv = user_data;
|
||||
NMPolicy *self = _PRIV_TO_SELF (priv);
|
||||
const char *ip_iface = nm_device_get_ip_iface (device);
|
||||
|
||||
nm_dns_manager_begin_updates (priv->dns_manager, __func__);
|
||||
|
||||
/* We catch already all the IP events registering on the device state changes but
|
||||
* the ones where the IP changes but the device state keep stable (i.e., activated):
|
||||
* ignore IP config changes but when the device is in activated state.
|
||||
* Prevents unecessary changes to DNS information.
|
||||
*/
|
||||
if (nm_device_get_state (device) == NM_DEVICE_STATE_ACTIVATED) {
|
||||
if (old_config != new_config) {
|
||||
if (old_config)
|
||||
nm_dns_manager_remove_ip_config (priv->dns_manager, old_config);
|
||||
if (new_config)
|
||||
nm_dns_manager_add_ip_config (priv->dns_manager, ip_iface, new_config, NM_DNS_IP_CONFIG_TYPE_DEFAULT);
|
||||
}
|
||||
update_ip_dns (self, AF_INET6);
|
||||
update_ip6_routing (self, TRUE);
|
||||
update_system_hostname (self, "ip6 conf");
|
||||
} else {
|
||||
/* Old configs get removed immediately */
|
||||
if (old_config)
|
||||
nm_dns_manager_remove_ip_config (priv->dns_manager, old_config);
|
||||
nm_dns_manager_set_ip_config (priv->dns_manager, old_config, NM_DNS_IP_CONFIG_TYPE_REMOVED);
|
||||
}
|
||||
|
||||
nm_dns_manager_end_updates (priv->dns_manager, __func__);
|
||||
|
|
@ -2016,8 +1992,8 @@ devices_list_register (NMPolicy *self, NMDevice *device)
|
|||
|
||||
/* Connect state-changed with _after, so that the handler is invoked after other handlers. */
|
||||
g_signal_connect_after (device, NM_DEVICE_STATE_CHANGED, (GCallback) device_state_changed, priv);
|
||||
g_signal_connect (device, NM_DEVICE_IP4_CONFIG_CHANGED, (GCallback) device_ip4_config_changed, priv);
|
||||
g_signal_connect (device, NM_DEVICE_IP6_CONFIG_CHANGED, (GCallback) device_ip6_config_changed, priv);
|
||||
g_signal_connect (device, NM_DEVICE_IP4_CONFIG_CHANGED, (GCallback) device_ip_config_changed, priv);
|
||||
g_signal_connect (device, NM_DEVICE_IP6_CONFIG_CHANGED, (GCallback) device_ip_config_changed, priv);
|
||||
g_signal_connect (device, NM_DEVICE_IP6_PREFIX_DELEGATED, (GCallback) device_ip6_prefix_delegated, priv);
|
||||
g_signal_connect (device, NM_DEVICE_IP6_SUBNET_NEEDED, (GCallback) device_ip6_subnet_needed, priv);
|
||||
g_signal_connect (device, "notify::" NM_DEVICE_AUTOCONNECT, (GCallback) device_autoconnect_changed, priv);
|
||||
|
|
@ -2072,21 +2048,16 @@ vpn_connection_activated (NMPolicy *self, NMVpnConnection *vpn)
|
|||
NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (self);
|
||||
NMIP4Config *ip4_config;
|
||||
NMIP6Config *ip6_config;
|
||||
const char *ip_iface;
|
||||
|
||||
nm_dns_manager_begin_updates (priv->dns_manager, __func__);
|
||||
|
||||
ip_iface = nm_vpn_connection_get_ip_iface (vpn, TRUE);
|
||||
|
||||
/* Add the VPN connection's IP configs from DNS */
|
||||
|
||||
ip4_config = nm_vpn_connection_get_ip4_config (vpn);
|
||||
if (ip4_config)
|
||||
nm_dns_manager_add_ip_config (priv->dns_manager, ip_iface, ip4_config, NM_DNS_IP_CONFIG_TYPE_VPN);
|
||||
nm_dns_manager_set_ip_config (priv->dns_manager, NM_IP_CONFIG_CAST (ip4_config), NM_DNS_IP_CONFIG_TYPE_VPN);
|
||||
|
||||
ip6_config = nm_vpn_connection_get_ip6_config (vpn);
|
||||
if (ip6_config)
|
||||
nm_dns_manager_add_ip_config (priv->dns_manager, ip_iface, ip6_config, NM_DNS_IP_CONFIG_TYPE_VPN);
|
||||
nm_dns_manager_set_ip_config (priv->dns_manager, NM_IP_CONFIG_CAST (ip6_config), NM_DNS_IP_CONFIG_TYPE_VPN);
|
||||
|
||||
update_routing_and_dns (self, TRUE);
|
||||
|
||||
|
|
@ -2103,16 +2074,12 @@ vpn_connection_deactivated (NMPolicy *self, NMVpnConnection *vpn)
|
|||
nm_dns_manager_begin_updates (priv->dns_manager, __func__);
|
||||
|
||||
ip4_config = nm_vpn_connection_get_ip4_config (vpn);
|
||||
if (ip4_config) {
|
||||
/* Remove the VPN connection's IP4 config from DNS */
|
||||
nm_dns_manager_remove_ip_config (priv->dns_manager, ip4_config);
|
||||
}
|
||||
if (ip4_config)
|
||||
nm_dns_manager_set_ip_config (priv->dns_manager, NM_IP_CONFIG_CAST (ip4_config), NM_DNS_IP_CONFIG_TYPE_REMOVED);
|
||||
|
||||
ip6_config = nm_vpn_connection_get_ip6_config (vpn);
|
||||
if (ip6_config) {
|
||||
/* Remove the VPN connection's IP6 config from DNS */
|
||||
nm_dns_manager_remove_ip_config (priv->dns_manager, ip6_config);
|
||||
}
|
||||
if (ip6_config)
|
||||
nm_dns_manager_set_ip_config (priv->dns_manager, NM_IP_CONFIG_CAST (ip6_config), NM_DNS_IP_CONFIG_TYPE_REMOVED);
|
||||
|
||||
update_routing_and_dns (self, TRUE);
|
||||
|
||||
|
|
|
|||
|
|
@ -238,4 +238,6 @@ typedef struct _NMSettingsConnection NMSettingsConnection;
|
|||
/* utils */
|
||||
typedef struct _NMUtilsIPv6IfaceId NMUtilsIPv6IfaceId;
|
||||
|
||||
#define NM_SETTING_CONNECTION_MDNS_UNKNOWN ((NMSettingConnectionMdns) -42)
|
||||
|
||||
#endif /* NM_TYPES_H */
|
||||
|
|
|
|||
|
|
@ -181,7 +181,7 @@ make_connection_setting (const char *file,
|
|||
const char *v;
|
||||
gs_free char *stable_id = NULL;
|
||||
const char *const *iter;
|
||||
int vint64;
|
||||
int vint64, i_val;
|
||||
|
||||
ifcfg_name = utils_get_ifcfg_name (file, TRUE);
|
||||
if (!ifcfg_name)
|
||||
|
|
@ -338,6 +338,13 @@ make_connection_setting (const char *file,
|
|||
vint64 = svGetValueInt64 (ifcfg, "AUTH_RETRIES", 10, -1, G_MAXINT32, -1);
|
||||
g_object_set (s_con, NM_SETTING_CONNECTION_AUTH_RETRIES, (gint) vint64, NULL);
|
||||
|
||||
i_val = NM_SETTING_CONNECTION_MDNS_DEFAULT;
|
||||
if (!svGetValueEnum (ifcfg, "MDNS",
|
||||
nm_setting_connection_mdns_get_type (),
|
||||
&i_val, NULL))
|
||||
PARSE_WARNING ("invalid MDNS setting");
|
||||
g_object_set (s_con, NM_SETTING_CONNECTION_MDNS, i_val, NULL);
|
||||
|
||||
return NM_SETTING (s_con);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1728,6 +1728,7 @@ write_connection_setting (NMSettingConnection *s_con, shvarFile *ifcfg)
|
|||
GString *str;
|
||||
const char *master, *master_iface = NULL, *type;
|
||||
gint vint;
|
||||
NMSettingConnectionMdns mdns;
|
||||
guint32 vuint32;
|
||||
const char *tmp;
|
||||
|
||||
|
|
@ -1888,6 +1889,13 @@ write_connection_setting (NMSettingConnection *s_con, shvarFile *ifcfg)
|
|||
|
||||
vint = nm_setting_connection_get_auth_retries (s_con);
|
||||
svSetValueInt64_cond (ifcfg, "AUTH_RETRIES", vint >= 0, vint);
|
||||
|
||||
mdns = nm_setting_connection_get_mdns (s_con);
|
||||
if (mdns != NM_SETTING_CONNECTION_MDNS_DEFAULT) {
|
||||
svSetValueEnum (ifcfg, "MDNS", nm_setting_connection_mdns_get_type (),
|
||||
mdns);
|
||||
} else
|
||||
svUnsetValue (ifcfg, "MDNS");
|
||||
}
|
||||
|
||||
static char *
|
||||
|
|
@ -3188,4 +3196,3 @@ nms_ifcfg_rh_writer_can_write_connection (NMConnection *connection, GError **err
|
|||
NM_PRINT_FMT_QUOTE_STRING (type));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -319,11 +319,15 @@ test_strip_search_trailing_dot (void)
|
|||
nm_ip4_config_add_search (config, "bar.");
|
||||
nm_ip4_config_add_search (config, "baz.com");
|
||||
nm_ip4_config_add_search (config, "baz.com.");
|
||||
nm_ip4_config_add_search (config, "foobar..");
|
||||
nm_ip4_config_add_search (config, ".foobar");
|
||||
nm_ip4_config_add_search (config, "~.");
|
||||
|
||||
g_assert_cmpuint (nm_ip4_config_get_num_searches (config), ==, 3);
|
||||
g_assert_cmpuint (nm_ip4_config_get_num_searches (config), ==, 4);
|
||||
g_assert_cmpstr (nm_ip4_config_get_search (config, 0), ==, "foo");
|
||||
g_assert_cmpstr (nm_ip4_config_get_search (config, 1), ==, "bar");
|
||||
g_assert_cmpstr (nm_ip4_config_get_search (config, 2), ==, "baz.com");
|
||||
g_assert_cmpstr (nm_ip4_config_get_search (config, 3), ==, "~");
|
||||
|
||||
g_object_unref (config);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -338,11 +338,15 @@ test_strip_search_trailing_dot (void)
|
|||
nm_ip6_config_add_search (config, "bar.");
|
||||
nm_ip6_config_add_search (config, "baz.com");
|
||||
nm_ip6_config_add_search (config, "baz.com.");
|
||||
nm_ip6_config_add_search (config, "foobar..");
|
||||
nm_ip6_config_add_search (config, ".foobar");
|
||||
nm_ip6_config_add_search (config, "~.");
|
||||
|
||||
g_assert_cmpuint (nm_ip6_config_get_num_searches (config), ==, 3);
|
||||
g_assert_cmpuint (nm_ip6_config_get_num_searches (config), ==, 4);
|
||||
g_assert_cmpstr (nm_ip6_config_get_search (config, 0), ==, "foo");
|
||||
g_assert_cmpstr (nm_ip6_config_get_search (config, 1), ==, "bar");
|
||||
g_assert_cmpstr (nm_ip6_config_get_search (config, 2), ==, "baz.com");
|
||||
g_assert_cmpstr (nm_ip6_config_get_search (config, 3), ==, "~");
|
||||
|
||||
g_object_unref (config);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1462,6 +1462,7 @@ nm_vpn_connection_ip4_config_get (NMVpnConnection *self, GVariant *dict)
|
|||
NMPlatformIP4Address address;
|
||||
guint32 u32, route_metric;
|
||||
NMSettingIPConfig *s_ip;
|
||||
NMSettingConnection *s_con;
|
||||
guint32 route_table;
|
||||
NMIP4Config *config;
|
||||
GVariantIter *iter;
|
||||
|
|
@ -1566,6 +1567,7 @@ nm_vpn_connection_ip4_config_get (NMVpnConnection *self, GVariant *dict)
|
|||
route_table = get_route_table (self, AF_INET, TRUE);
|
||||
route_metric = nm_vpn_connection_get_ip4_route_metric (self);
|
||||
s_ip = nm_connection_get_setting_ip4_config (_get_applied_connection (self));
|
||||
s_con = nm_connection_get_setting_connection (_get_applied_connection (self));
|
||||
|
||||
if (nm_setting_ip_config_get_ignore_auto_routes (s_ip)) {
|
||||
/* ignore VPN routes */
|
||||
|
|
@ -1623,6 +1625,7 @@ nm_vpn_connection_ip4_config_get (NMVpnConnection *self, GVariant *dict)
|
|||
/* Merge in user overrides from the NMConnection's IPv4 setting */
|
||||
nm_ip4_config_merge_setting (config,
|
||||
s_ip,
|
||||
nm_setting_connection_get_mdns (s_con),
|
||||
route_table,
|
||||
route_metric);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue