mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager
synced 2024-10-14 20:18:39 +00:00
core: update existing IP[46]Config of device instead of replacing it (bgo #707617)
When the IP[46]Config changes, a new configuration gets assembled. Before, whenever the new configuration was different than the current one, the IP[46]Config of the device was completely replaced. This also meant, that the old dbus IP[46]Config object was removed and the new one was exported. Now instead of recreating a new configuration, it updates the existing (already exported) configuration in-place. Also, add new gobject properties 'gateway' and 'searches' to the config class, they will be exported over dbus. Also, whenever any of the exported properties changes, make sure that a notify signal gets emitted. https://bugzilla.gnome.org/show_bug.cgi?id=707617 Signed-off-by: Thomas Haller <thaller@redhat.com>
This commit is contained in:
parent
f0fccd99a5
commit
db9b7e10ac
|
@ -2,21 +2,15 @@
|
||||||
|
|
||||||
<node name="/" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0">
|
<node name="/" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0">
|
||||||
<interface name="org.freedesktop.NetworkManager.IP4Config">
|
<interface name="org.freedesktop.NetworkManager.IP4Config">
|
||||||
|
<property name="Gateway" type="s" access="read">
|
||||||
|
<tp:docstring>The gateway in use.</tp:docstring>
|
||||||
|
</property>
|
||||||
<property name="Addresses" type="aau" access="read">
|
<property name="Addresses" type="aau" access="read">
|
||||||
<tp:docstring>Array of tuples of IPv4 address/prefix/gateway. All 3
|
<tp:docstring>Array of tuples of IPv4 address/prefix/gateway. All 3
|
||||||
elements of each tuple are in network byte order. Essentially:
|
elements of each tuple are in network byte order. Essentially:
|
||||||
[(addr, prefix, gateway), (addr, prefix, gateway), ...]
|
[(addr, prefix, gateway), (addr, prefix, gateway), ...]
|
||||||
</tp:docstring>
|
</tp:docstring>
|
||||||
</property>
|
</property>
|
||||||
<property name="Nameservers" type="au" access="read">
|
|
||||||
<tp:docstring>The nameservers in use.</tp:docstring>
|
|
||||||
</property>
|
|
||||||
<property name="WinsServers" type="au" access="read">
|
|
||||||
<tp:docstring>The Windows Internet Name Service servers associated with the connection. Each address is in network byte order.</tp:docstring>
|
|
||||||
</property>
|
|
||||||
<property name="Domains" type="as" access="read">
|
|
||||||
<tp:docstring>A list of domains this address belongs to.</tp:docstring>
|
|
||||||
</property>
|
|
||||||
<property name="Routes" type="aau" access="read">
|
<property name="Routes" type="aau" access="read">
|
||||||
<tp:docstring>Tuples of IPv4 route/prefix/next-hop/metric. All 4 elements
|
<tp:docstring>Tuples of IPv4 route/prefix/next-hop/metric. All 4 elements
|
||||||
of each tuple are in network byte order. 'route' and 'next hop' are IPv4
|
of each tuple are in network byte order. 'route' and 'next hop' are IPv4
|
||||||
|
@ -24,6 +18,18 @@
|
||||||
[(route, prefix, next-hop, metric), (route, prefix, next-hop, metric), ...]
|
[(route, prefix, next-hop, metric), (route, prefix, next-hop, metric), ...]
|
||||||
</tp:docstring>
|
</tp:docstring>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="Nameservers" type="au" access="read">
|
||||||
|
<tp:docstring>The nameservers in use.</tp:docstring>
|
||||||
|
</property>
|
||||||
|
<property name="Domains" type="as" access="read">
|
||||||
|
<tp:docstring>A list of domains this address belongs to.</tp:docstring>
|
||||||
|
</property>
|
||||||
|
<property name="Searches" type="as" access="read">
|
||||||
|
<tp:docstring>A list of dns searches.</tp:docstring>
|
||||||
|
</property>
|
||||||
|
<property name="WinsServers" type="au" access="read">
|
||||||
|
<tp:docstring>The Windows Internet Name Service servers associated with the connection. Each address is in network byte order.</tp:docstring>
|
||||||
|
</property>
|
||||||
</interface>
|
</interface>
|
||||||
</node>
|
</node>
|
||||||
|
|
||||||
|
|
|
@ -2,17 +2,23 @@
|
||||||
|
|
||||||
<node name="/" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0">
|
<node name="/" xmlns:tp="http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0">
|
||||||
<interface name="org.freedesktop.NetworkManager.IP6Config">
|
<interface name="org.freedesktop.NetworkManager.IP6Config">
|
||||||
|
<property name="Gateway" type="s" access="read">
|
||||||
|
<tp:docstring>The gateway in use.</tp:docstring>
|
||||||
|
</property>
|
||||||
<property name="Addresses" type="a(ayuay)" access="read">
|
<property name="Addresses" type="a(ayuay)" access="read">
|
||||||
<tp:docstring>Tuples of IPv6 address/prefix/gateway.</tp:docstring>
|
<tp:docstring>Tuples of IPv6 address/prefix/gateway.</tp:docstring>
|
||||||
</property>
|
</property>
|
||||||
|
<property name="Routes" type="a(ayuayu)" access="read">
|
||||||
|
<tp:docstring>Tuples of IPv6 route/prefix/next-hop/metric.</tp:docstring>
|
||||||
|
</property>
|
||||||
<property name="Nameservers" type="aay" access="read">
|
<property name="Nameservers" type="aay" access="read">
|
||||||
<tp:docstring>The nameservers in use.</tp:docstring>
|
<tp:docstring>The nameservers in use.</tp:docstring>
|
||||||
</property>
|
</property>
|
||||||
<property name="Domains" type="as" access="read">
|
<property name="Domains" type="as" access="read">
|
||||||
<tp:docstring>A list of domains this address belongs to.</tp:docstring>
|
<tp:docstring>A list of domains this address belongs to.</tp:docstring>
|
||||||
</property>
|
</property>
|
||||||
<property name="Routes" type="a(ayuayu)" access="read">
|
<property name="Searches" type="as" access="read">
|
||||||
<tp:docstring>Tuples of IPv6 route/prefix/next-hop/metric.</tp:docstring>
|
<tp:docstring>A list of dns searches.</tp:docstring>
|
||||||
</property>
|
</property>
|
||||||
</interface>
|
</interface>
|
||||||
</node>
|
</node>
|
||||||
|
|
|
@ -37,19 +37,23 @@ G_DEFINE_TYPE (NMIP4Config, nm_ip4_config, NM_TYPE_OBJECT)
|
||||||
typedef struct {
|
typedef struct {
|
||||||
DBusGProxy *proxy;
|
DBusGProxy *proxy;
|
||||||
|
|
||||||
|
char *gateway;
|
||||||
GSList *addresses;
|
GSList *addresses;
|
||||||
|
GSList *routes;
|
||||||
GArray *nameservers;
|
GArray *nameservers;
|
||||||
GPtrArray *domains;
|
GPtrArray *domains;
|
||||||
GSList *routes;
|
GPtrArray *searches;
|
||||||
GArray *wins;
|
GArray *wins;
|
||||||
} NMIP4ConfigPrivate;
|
} NMIP4ConfigPrivate;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
PROP_0,
|
PROP_0,
|
||||||
|
PROP_GATEWAY,
|
||||||
PROP_ADDRESSES,
|
PROP_ADDRESSES,
|
||||||
|
PROP_ROUTES,
|
||||||
PROP_NAMESERVERS,
|
PROP_NAMESERVERS,
|
||||||
PROP_DOMAINS,
|
PROP_DOMAINS,
|
||||||
PROP_ROUTES,
|
PROP_SEARCHES,
|
||||||
PROP_WINS_SERVERS,
|
PROP_WINS_SERVERS,
|
||||||
|
|
||||||
LAST_PROP
|
LAST_PROP
|
||||||
|
@ -90,12 +94,12 @@ demarshal_ip4_array (NMObject *object, GParamSpec *pspec, GValue *value, gpointe
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
demarshal_domains (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field)
|
demarshal_string_array (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field)
|
||||||
{
|
{
|
||||||
if (!_nm_string_array_demarshal (value, (GPtrArray **) field))
|
if (!_nm_string_array_demarshal (value, (GPtrArray **) field))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
_nm_object_queue_notify (object, NM_IP4_CONFIG_DOMAINS);
|
_nm_object_queue_notify (object, pspec->name);
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,10 +123,12 @@ register_properties (NMIP4Config *config)
|
||||||
{
|
{
|
||||||
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
|
||||||
const NMPropertiesInfo property_info[] = {
|
const NMPropertiesInfo property_info[] = {
|
||||||
|
{ NM_IP4_CONFIG_GATEWAY, &priv->gateway, },
|
||||||
{ NM_IP4_CONFIG_ADDRESSES, &priv->addresses, demarshal_ip4_address_array },
|
{ NM_IP4_CONFIG_ADDRESSES, &priv->addresses, demarshal_ip4_address_array },
|
||||||
{ NM_IP4_CONFIG_NAMESERVERS, &priv->nameservers, demarshal_ip4_array },
|
|
||||||
{ NM_IP4_CONFIG_DOMAINS, &priv->domains, demarshal_domains },
|
|
||||||
{ NM_IP4_CONFIG_ROUTES, &priv->routes, demarshal_ip4_routes_array },
|
{ NM_IP4_CONFIG_ROUTES, &priv->routes, demarshal_ip4_routes_array },
|
||||||
|
{ NM_IP4_CONFIG_NAMESERVERS, &priv->nameservers, demarshal_ip4_array },
|
||||||
|
{ NM_IP4_CONFIG_DOMAINS, &priv->domains, demarshal_string_array },
|
||||||
|
{ NM_IP4_CONFIG_SEARCHES, &priv->searches, demarshal_string_array },
|
||||||
{ NM_IP4_CONFIG_WINS_SERVERS, &priv->wins, demarshal_ip4_array },
|
{ NM_IP4_CONFIG_WINS_SERVERS, &priv->wins, demarshal_ip4_array },
|
||||||
{ NULL },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
@ -148,6 +154,8 @@ finalize (GObject *object)
|
||||||
{
|
{
|
||||||
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (object);
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (object);
|
||||||
|
|
||||||
|
g_free (priv->gateway);
|
||||||
|
|
||||||
g_slist_foreach (priv->addresses, (GFunc) g_free, NULL);
|
g_slist_foreach (priv->addresses, (GFunc) g_free, NULL);
|
||||||
g_slist_free (priv->addresses);
|
g_slist_free (priv->addresses);
|
||||||
|
|
||||||
|
@ -165,6 +173,11 @@ finalize (GObject *object)
|
||||||
g_ptr_array_free (priv->domains, TRUE);
|
g_ptr_array_free (priv->domains, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (priv->searches) {
|
||||||
|
g_ptr_array_foreach (priv->searches, (GFunc) g_free, NULL);
|
||||||
|
g_ptr_array_free (priv->searches, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
g_object_unref (priv->proxy);
|
g_object_unref (priv->proxy);
|
||||||
|
|
||||||
G_OBJECT_CLASS (nm_ip4_config_parent_class)->finalize (object);
|
G_OBJECT_CLASS (nm_ip4_config_parent_class)->finalize (object);
|
||||||
|
@ -182,17 +195,23 @@ get_property (GObject *object,
|
||||||
_nm_object_ensure_inited (NM_OBJECT (object));
|
_nm_object_ensure_inited (NM_OBJECT (object));
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
|
case PROP_GATEWAY:
|
||||||
|
g_value_set_string (value, nm_ip4_config_get_gateway (self));
|
||||||
|
break;
|
||||||
case PROP_ADDRESSES:
|
case PROP_ADDRESSES:
|
||||||
nm_utils_ip4_addresses_to_gvalue (priv->addresses, value);
|
nm_utils_ip4_addresses_to_gvalue (priv->addresses, value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_ROUTES:
|
||||||
|
nm_utils_ip4_routes_to_gvalue (priv->routes, value);
|
||||||
|
break;
|
||||||
case PROP_NAMESERVERS:
|
case PROP_NAMESERVERS:
|
||||||
g_value_set_boxed (value, nm_ip4_config_get_nameservers (self));
|
g_value_set_boxed (value, nm_ip4_config_get_nameservers (self));
|
||||||
break;
|
break;
|
||||||
case PROP_DOMAINS:
|
case PROP_DOMAINS:
|
||||||
g_value_set_boxed (value, nm_ip4_config_get_domains (self));
|
g_value_set_boxed (value, nm_ip4_config_get_domains (self));
|
||||||
break;
|
break;
|
||||||
case PROP_ROUTES:
|
case PROP_SEARCHES:
|
||||||
nm_utils_ip4_routes_to_gvalue (priv->routes, value);
|
g_value_set_boxed (value, nm_ip4_config_get_searches (self));
|
||||||
break;
|
break;
|
||||||
case PROP_WINS_SERVERS:
|
case PROP_WINS_SERVERS:
|
||||||
g_value_set_boxed (value, nm_ip4_config_get_wins_servers (self));
|
g_value_set_boxed (value, nm_ip4_config_get_wins_servers (self));
|
||||||
|
@ -217,6 +236,21 @@ nm_ip4_config_class_init (NMIP4ConfigClass *config_class)
|
||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NMIP4Config:gateway:
|
||||||
|
*
|
||||||
|
* The IP4 gateway address of the configuration as string.
|
||||||
|
*
|
||||||
|
* Since: 0.9.10
|
||||||
|
**/
|
||||||
|
g_object_class_install_property
|
||||||
|
(object_class, PROP_GATEWAY,
|
||||||
|
g_param_spec_string (NM_IP4_CONFIG_GATEWAY,
|
||||||
|
"Gateway",
|
||||||
|
"Gateway",
|
||||||
|
NULL,
|
||||||
|
G_PARAM_READABLE));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NMIP4Config:addresses:
|
* NMIP4Config:addresses:
|
||||||
*
|
*
|
||||||
|
@ -229,6 +263,18 @@ nm_ip4_config_class_init (NMIP4ConfigClass *config_class)
|
||||||
"Addresses",
|
"Addresses",
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NMIP4Config:routes:
|
||||||
|
*
|
||||||
|
* The #GPtrArray containing #NMSettingIP4Route<!-- -->s of the configuration.
|
||||||
|
**/
|
||||||
|
g_object_class_install_property
|
||||||
|
(object_class, PROP_ROUTES,
|
||||||
|
g_param_spec_pointer (NM_IP4_CONFIG_ROUTES,
|
||||||
|
"Routes",
|
||||||
|
"Routes",
|
||||||
|
G_PARAM_READABLE));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NMIP4Config:nameservers:
|
* NMIP4Config:nameservers:
|
||||||
*
|
*
|
||||||
|
@ -256,16 +302,19 @@ nm_ip4_config_class_init (NMIP4ConfigClass *config_class)
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NMIP4Config:routes:
|
* NMIP4Config:searches:
|
||||||
*
|
*
|
||||||
* The #GPtrArray containing #NMSettingIP4Route<!-- -->s of the configuration.
|
* The #GPtrArray containing dns search strings of the configuration.
|
||||||
|
*
|
||||||
|
* Since: 0.9.10
|
||||||
**/
|
**/
|
||||||
g_object_class_install_property
|
g_object_class_install_property
|
||||||
(object_class, PROP_ROUTES,
|
(object_class, PROP_SEARCHES,
|
||||||
g_param_spec_pointer (NM_IP4_CONFIG_ROUTES,
|
g_param_spec_boxed (NM_IP4_CONFIG_SEARCHES,
|
||||||
"Routes",
|
"Searches",
|
||||||
"Routes",
|
"DNS searches",
|
||||||
G_PARAM_READABLE));
|
NM_TYPE_STRING_ARRAY,
|
||||||
|
G_PARAM_READABLE));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NMIP4Config:wins-servers:
|
* NMIP4Config:wins-servers:
|
||||||
|
@ -299,6 +348,25 @@ nm_ip4_config_new (DBusGConnection *connection, const char *object_path)
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nm_ip4_config_get_gateway:
|
||||||
|
* @config: a #NMIP4Config
|
||||||
|
*
|
||||||
|
* Gets the IP4 gateway address.
|
||||||
|
*
|
||||||
|
* Returns: the IP4 address of the gateway.
|
||||||
|
*
|
||||||
|
* Since: 0.9.10
|
||||||
|
**/
|
||||||
|
const char *
|
||||||
|
nm_ip4_config_get_gateway (NMIP4Config *config)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (NM_IS_IP4_CONFIG (config), NULL);
|
||||||
|
|
||||||
|
_nm_object_ensure_inited (NM_OBJECT (config));
|
||||||
|
return NM_IP4_CONFIG_GET_PRIVATE (config)->gateway;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nm_ip4_config_get_addresses:
|
* nm_ip4_config_get_addresses:
|
||||||
* @config: a #NMIP4Config
|
* @config: a #NMIP4Config
|
||||||
|
@ -353,6 +421,26 @@ nm_ip4_config_get_domains (NMIP4Config *config)
|
||||||
return handle_ptr_array_return (NM_IP4_CONFIG_GET_PRIVATE (config)->domains);
|
return handle_ptr_array_return (NM_IP4_CONFIG_GET_PRIVATE (config)->domains);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nm_ip4_config_get_searches:
|
||||||
|
* @config: a #NMIP4Config
|
||||||
|
*
|
||||||
|
* Gets the dns searches.
|
||||||
|
*
|
||||||
|
* Returns: (element-type utf8): the #GPtrArray containing dns searches as strings. This is the
|
||||||
|
* internal copy used by the configuration, and must not be modified.
|
||||||
|
*
|
||||||
|
* Since: 0.9.10
|
||||||
|
**/
|
||||||
|
const GPtrArray *
|
||||||
|
nm_ip4_config_get_searches (NMIP4Config *config)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (NM_IS_IP4_CONFIG (config), NULL);
|
||||||
|
|
||||||
|
_nm_object_ensure_inited (NM_OBJECT (config));
|
||||||
|
return handle_ptr_array_return (NM_IP4_CONFIG_GET_PRIVATE (config)->searches);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nm_ip4_config_get_wins_servers:
|
* nm_ip4_config_get_wins_servers:
|
||||||
* @config: a #NMIP4Config
|
* @config: a #NMIP4Config
|
||||||
|
|
|
@ -54,20 +54,24 @@ typedef struct {
|
||||||
void (*_reserved6) (void);
|
void (*_reserved6) (void);
|
||||||
} NMIP4ConfigClass;
|
} NMIP4ConfigClass;
|
||||||
|
|
||||||
|
#define NM_IP4_CONFIG_GATEWAY "gateway"
|
||||||
#define NM_IP4_CONFIG_ADDRESSES "addresses"
|
#define NM_IP4_CONFIG_ADDRESSES "addresses"
|
||||||
|
#define NM_IP4_CONFIG_ROUTES "routes"
|
||||||
#define NM_IP4_CONFIG_NAMESERVERS "nameservers"
|
#define NM_IP4_CONFIG_NAMESERVERS "nameservers"
|
||||||
#define NM_IP4_CONFIG_DOMAINS "domains"
|
#define NM_IP4_CONFIG_DOMAINS "domains"
|
||||||
#define NM_IP4_CONFIG_ROUTES "routes"
|
#define NM_IP4_CONFIG_SEARCHES "searches"
|
||||||
#define NM_IP4_CONFIG_WINS_SERVERS "wins-servers"
|
#define NM_IP4_CONFIG_WINS_SERVERS "wins-servers"
|
||||||
|
|
||||||
GType nm_ip4_config_get_type (void);
|
GType nm_ip4_config_get_type (void);
|
||||||
|
|
||||||
GObject *nm_ip4_config_new (DBusGConnection *connection, const char *object_path);
|
GObject *nm_ip4_config_new (DBusGConnection *connection, const char *object_path);
|
||||||
|
|
||||||
|
const char * nm_ip4_config_get_gateway (NMIP4Config *config);
|
||||||
const GSList * nm_ip4_config_get_addresses (NMIP4Config *config);
|
const GSList * nm_ip4_config_get_addresses (NMIP4Config *config);
|
||||||
|
const GSList * nm_ip4_config_get_routes (NMIP4Config *config);
|
||||||
const GArray * nm_ip4_config_get_nameservers (NMIP4Config *config);
|
const GArray * nm_ip4_config_get_nameservers (NMIP4Config *config);
|
||||||
const GPtrArray *nm_ip4_config_get_domains (NMIP4Config *config);
|
const GPtrArray *nm_ip4_config_get_domains (NMIP4Config *config);
|
||||||
const GSList * nm_ip4_config_get_routes (NMIP4Config *config);
|
const GPtrArray *nm_ip4_config_get_searches (NMIP4Config *config);
|
||||||
const GArray * nm_ip4_config_get_wins_servers (NMIP4Config *config);
|
const GArray * nm_ip4_config_get_wins_servers (NMIP4Config *config);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
|
@ -37,18 +37,22 @@ G_DEFINE_TYPE (NMIP6Config, nm_ip6_config, NM_TYPE_OBJECT)
|
||||||
typedef struct {
|
typedef struct {
|
||||||
DBusGProxy *proxy;
|
DBusGProxy *proxy;
|
||||||
|
|
||||||
|
char *gateway;
|
||||||
GSList *addresses;
|
GSList *addresses;
|
||||||
|
GSList *routes;
|
||||||
GSList *nameservers;
|
GSList *nameservers;
|
||||||
GPtrArray *domains;
|
GPtrArray *domains;
|
||||||
GSList *routes;
|
GPtrArray *searches;
|
||||||
} NMIP6ConfigPrivate;
|
} NMIP6ConfigPrivate;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
PROP_0,
|
PROP_0,
|
||||||
|
PROP_GATEWAY,
|
||||||
PROP_ADDRESSES,
|
PROP_ADDRESSES,
|
||||||
|
PROP_ROUTES,
|
||||||
PROP_NAMESERVERS,
|
PROP_NAMESERVERS,
|
||||||
PROP_DOMAINS,
|
PROP_DOMAINS,
|
||||||
PROP_ROUTES,
|
PROP_SEARCHES,
|
||||||
|
|
||||||
LAST_PROP
|
LAST_PROP
|
||||||
};
|
};
|
||||||
|
@ -108,6 +112,16 @@ demarshal_domains (NMObject *object, GParamSpec *pspec, GValue *value, gpointer
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
demarshal_searches (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field)
|
||||||
|
{
|
||||||
|
if (!_nm_string_array_demarshal (value, (GPtrArray **) field))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
_nm_object_queue_notify (object, NM_IP6_CONFIG_SEARCHES);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
demarshal_ip6_routes_array (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field)
|
demarshal_ip6_routes_array (NMObject *object, GParamSpec *pspec, GValue *value, gpointer field)
|
||||||
{
|
{
|
||||||
|
@ -128,10 +142,12 @@ register_properties (NMIP6Config *config)
|
||||||
{
|
{
|
||||||
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
|
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
|
||||||
const NMPropertiesInfo property_info[] = {
|
const NMPropertiesInfo property_info[] = {
|
||||||
|
{ NM_IP6_CONFIG_GATEWAY, &priv->gateway, },
|
||||||
{ NM_IP6_CONFIG_ADDRESSES, &priv->addresses, demarshal_ip6_address_array },
|
{ NM_IP6_CONFIG_ADDRESSES, &priv->addresses, demarshal_ip6_address_array },
|
||||||
|
{ NM_IP6_CONFIG_ROUTES, &priv->routes, demarshal_ip6_routes_array },
|
||||||
{ NM_IP6_CONFIG_NAMESERVERS, &priv->nameservers, demarshal_ip6_nameserver_array },
|
{ NM_IP6_CONFIG_NAMESERVERS, &priv->nameservers, demarshal_ip6_nameserver_array },
|
||||||
{ NM_IP6_CONFIG_DOMAINS, &priv->domains, demarshal_domains },
|
{ NM_IP6_CONFIG_DOMAINS, &priv->domains, demarshal_domains },
|
||||||
{ NM_IP6_CONFIG_ROUTES, &priv->routes, demarshal_ip6_routes_array },
|
{ NM_IP6_CONFIG_SEARCHES, &priv->searches, demarshal_searches },
|
||||||
{ NULL },
|
{ NULL },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -140,6 +156,25 @@ register_properties (NMIP6Config *config)
|
||||||
property_info);
|
property_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nm_ip6_config_get_gateway:
|
||||||
|
* @config: a #NMIP6Config
|
||||||
|
*
|
||||||
|
* Gets the IP6 gateway.
|
||||||
|
*
|
||||||
|
* Returns: the IPv6 gateway of the configuration.
|
||||||
|
*
|
||||||
|
* Since: 0.9.10
|
||||||
|
**/
|
||||||
|
const char *
|
||||||
|
nm_ip6_config_get_gateway (NMIP6Config *config)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (NM_IS_IP6_CONFIG (config), NULL);
|
||||||
|
|
||||||
|
_nm_object_ensure_inited (NM_OBJECT (config));
|
||||||
|
return NM_IP6_CONFIG_GET_PRIVATE (config)->gateway;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nm_ip6_config_get_addresses:
|
* nm_ip6_config_get_addresses:
|
||||||
* @config: a #NMIP6Config
|
* @config: a #NMIP6Config
|
||||||
|
@ -197,6 +232,26 @@ nm_ip6_config_get_domains (NMIP6Config *config)
|
||||||
return handle_ptr_array_return (NM_IP6_CONFIG_GET_PRIVATE (config)->domains);
|
return handle_ptr_array_return (NM_IP6_CONFIG_GET_PRIVATE (config)->domains);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* nm_ip6_config_get_searches:
|
||||||
|
* @config: a #NMIP6Config
|
||||||
|
*
|
||||||
|
* Gets the dns searches.
|
||||||
|
*
|
||||||
|
* Returns: (element-type utf8): the #GPtrArray containing dns searches as strings.
|
||||||
|
* This is the internal copy used by the configuration, and must not be modified.
|
||||||
|
*
|
||||||
|
* Since: 0.9.10
|
||||||
|
**/
|
||||||
|
const GPtrArray *
|
||||||
|
nm_ip6_config_get_searches (NMIP6Config *config)
|
||||||
|
{
|
||||||
|
g_return_val_if_fail (NM_IS_IP6_CONFIG (config), NULL);
|
||||||
|
|
||||||
|
_nm_object_ensure_inited (NM_OBJECT (config));
|
||||||
|
return handle_ptr_array_return (NM_IP6_CONFIG_GET_PRIVATE (config)->searches);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* nm_ip6_config_get_routes:
|
* nm_ip6_config_get_routes:
|
||||||
* @config: a #NMIP6Config
|
* @config: a #NMIP6Config
|
||||||
|
@ -232,6 +287,8 @@ finalize (GObject *object)
|
||||||
{
|
{
|
||||||
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (object);
|
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (object);
|
||||||
|
|
||||||
|
g_free (priv->gateway);
|
||||||
|
|
||||||
g_slist_foreach (priv->addresses, (GFunc) nm_ip6_address_unref, NULL);
|
g_slist_foreach (priv->addresses, (GFunc) nm_ip6_address_unref, NULL);
|
||||||
g_slist_free (priv->addresses);
|
g_slist_free (priv->addresses);
|
||||||
|
|
||||||
|
@ -246,6 +303,11 @@ finalize (GObject *object)
|
||||||
g_ptr_array_free (priv->domains, TRUE);
|
g_ptr_array_free (priv->domains, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (priv->searches) {
|
||||||
|
g_ptr_array_foreach (priv->searches, (GFunc) g_free, NULL);
|
||||||
|
g_ptr_array_free (priv->searches, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
g_object_unref (priv->proxy);
|
g_object_unref (priv->proxy);
|
||||||
|
|
||||||
G_OBJECT_CLASS (nm_ip6_config_parent_class)->finalize (object);
|
G_OBJECT_CLASS (nm_ip6_config_parent_class)->finalize (object);
|
||||||
|
@ -263,17 +325,23 @@ get_property (GObject *object,
|
||||||
_nm_object_ensure_inited (NM_OBJECT (object));
|
_nm_object_ensure_inited (NM_OBJECT (object));
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
|
case PROP_GATEWAY:
|
||||||
|
g_value_set_string (value, nm_ip6_config_get_gateway (self));
|
||||||
|
break;
|
||||||
case PROP_ADDRESSES:
|
case PROP_ADDRESSES:
|
||||||
nm_utils_ip6_addresses_to_gvalue (priv->addresses, value);
|
nm_utils_ip6_addresses_to_gvalue (priv->addresses, value);
|
||||||
break;
|
break;
|
||||||
|
case PROP_ROUTES:
|
||||||
|
nm_utils_ip6_routes_to_gvalue (priv->routes, value);
|
||||||
|
break;
|
||||||
case PROP_NAMESERVERS:
|
case PROP_NAMESERVERS:
|
||||||
g_value_set_boxed (value, nm_ip6_config_get_nameservers (self));
|
g_value_set_boxed (value, nm_ip6_config_get_nameservers (self));
|
||||||
break;
|
break;
|
||||||
case PROP_DOMAINS:
|
case PROP_DOMAINS:
|
||||||
g_value_set_boxed (value, nm_ip6_config_get_domains (self));
|
g_value_set_boxed (value, nm_ip6_config_get_domains (self));
|
||||||
break;
|
break;
|
||||||
case PROP_ROUTES:
|
case PROP_SEARCHES:
|
||||||
nm_utils_ip6_routes_to_gvalue (priv->routes, value);
|
g_value_set_boxed (value, nm_ip6_config_get_searches (self));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
@ -300,6 +368,21 @@ nm_ip6_config_class_init (NMIP6ConfigClass *config_class)
|
||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NMIP6Config:gateway:
|
||||||
|
*
|
||||||
|
* The IPv6 gateway as string
|
||||||
|
*
|
||||||
|
* Since: 0.9.10
|
||||||
|
**/
|
||||||
|
g_object_class_install_property
|
||||||
|
(object_class, PROP_ROUTES,
|
||||||
|
g_param_spec_string (NM_IP6_CONFIG_ROUTES,
|
||||||
|
"Gateway",
|
||||||
|
"Gateway",
|
||||||
|
NULL,
|
||||||
|
G_PARAM_READABLE));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NMIP6Config:addresses:
|
* NMIP6Config:addresses:
|
||||||
*
|
*
|
||||||
|
@ -315,6 +398,21 @@ nm_ip6_config_class_init (NMIP6ConfigClass *config_class)
|
||||||
NM_TYPE_IP6_ADDRESS_OBJECT_ARRAY,
|
NM_TYPE_IP6_ADDRESS_OBJECT_ARRAY,
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NMIP6Config:routes:
|
||||||
|
*
|
||||||
|
* The #GPtrArray containing the IPv6 routes; use
|
||||||
|
* nm_utils_ip6_routes_from_gvalue() to return a #GSList of
|
||||||
|
* #NMSettingIP6Address objects that is more usable than the raw data.
|
||||||
|
**/
|
||||||
|
g_object_class_install_property
|
||||||
|
(object_class, PROP_ROUTES,
|
||||||
|
g_param_spec_boxed (NM_IP6_CONFIG_ROUTES,
|
||||||
|
"Routes",
|
||||||
|
"Routes",
|
||||||
|
NM_TYPE_IP6_ROUTE_OBJECT_ARRAY,
|
||||||
|
G_PARAM_READABLE));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NMIP6Config:nameservers:
|
* NMIP6Config:nameservers:
|
||||||
*
|
*
|
||||||
|
@ -343,18 +441,19 @@ nm_ip6_config_class_init (NMIP6ConfigClass *config_class)
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NMIP6Config:routes:
|
* NMIP6Config:searches:
|
||||||
*
|
*
|
||||||
* The #GPtrArray containing the IPv6 routes; use
|
* The #GPtrArray containing dns search strings of the configuration.
|
||||||
* nm_utils_ip6_routes_from_gvalue() to return a #GSList of
|
*
|
||||||
* #NMSettingIP6Address objects that is more usable than the raw data.
|
* Since: 0.9.10
|
||||||
**/
|
**/
|
||||||
g_object_class_install_property
|
g_object_class_install_property
|
||||||
(object_class, PROP_ROUTES,
|
(object_class, PROP_SEARCHES,
|
||||||
g_param_spec_boxed (NM_IP6_CONFIG_ROUTES,
|
g_param_spec_boxed (NM_IP6_CONFIG_SEARCHES,
|
||||||
"Routes",
|
"Searches",
|
||||||
"Routes",
|
"DNS Searches",
|
||||||
NM_TYPE_IP6_ROUTE_OBJECT_ARRAY,
|
NM_TYPE_STRING_ARRAY,
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,19 +54,23 @@ typedef struct {
|
||||||
void (*_reserved6) (void);
|
void (*_reserved6) (void);
|
||||||
} NMIP6ConfigClass;
|
} NMIP6ConfigClass;
|
||||||
|
|
||||||
|
#define NM_IP6_CONFIG_GATEWAY "gateway"
|
||||||
#define NM_IP6_CONFIG_ADDRESSES "addresses"
|
#define NM_IP6_CONFIG_ADDRESSES "addresses"
|
||||||
|
#define NM_IP6_CONFIG_ROUTES "routes"
|
||||||
#define NM_IP6_CONFIG_NAMESERVERS "nameservers"
|
#define NM_IP6_CONFIG_NAMESERVERS "nameservers"
|
||||||
#define NM_IP6_CONFIG_DOMAINS "domains"
|
#define NM_IP6_CONFIG_DOMAINS "domains"
|
||||||
#define NM_IP6_CONFIG_ROUTES "routes"
|
#define NM_IP6_CONFIG_SEARCHES "searches"
|
||||||
|
|
||||||
GType nm_ip6_config_get_type (void);
|
GType nm_ip6_config_get_type (void);
|
||||||
|
|
||||||
GObject *nm_ip6_config_new (DBusGConnection *connection, const char *object_path);
|
GObject *nm_ip6_config_new (DBusGConnection *connection, const char *object_path);
|
||||||
|
|
||||||
|
const char * nm_ip6_config_get_gateway (NMIP6Config *config);
|
||||||
const GSList * nm_ip6_config_get_addresses (NMIP6Config *config);
|
const GSList * nm_ip6_config_get_addresses (NMIP6Config *config);
|
||||||
|
const GSList * nm_ip6_config_get_routes (NMIP6Config *config);
|
||||||
const GSList * nm_ip6_config_get_nameservers (NMIP6Config *config);
|
const GSList * nm_ip6_config_get_nameservers (NMIP6Config *config);
|
||||||
const GPtrArray *nm_ip6_config_get_domains (NMIP6Config *config);
|
const GPtrArray *nm_ip6_config_get_domains (NMIP6Config *config);
|
||||||
const GSList * nm_ip6_config_get_routes (NMIP6Config *config);
|
const GPtrArray *nm_ip6_config_get_searches (NMIP6Config *config);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
|
|
@ -4558,7 +4558,9 @@ nm_device_set_ip4_config (NMDevice *self,
|
||||||
NMDevicePrivate *priv;
|
NMDevicePrivate *priv;
|
||||||
const char *ip_iface;
|
const char *ip_iface;
|
||||||
NMIP4Config *old_config = NULL;
|
NMIP4Config *old_config = NULL;
|
||||||
|
gboolean has_changes = FALSE;
|
||||||
gboolean success = TRUE;
|
gboolean success = TRUE;
|
||||||
|
NMDeviceStateReason reason_local = NM_DEVICE_STATE_REASON_NONE;
|
||||||
int ip_ifindex;
|
int ip_ifindex;
|
||||||
|
|
||||||
g_return_val_if_fail (NM_IS_DEVICE (self), FALSE);
|
g_return_val_if_fail (NM_IS_DEVICE (self), FALSE);
|
||||||
|
@ -4570,36 +4572,52 @@ nm_device_set_ip4_config (NMDevice *self,
|
||||||
old_config = priv->ip4_config;
|
old_config = priv->ip4_config;
|
||||||
|
|
||||||
/* Always commit to nm-platform to update lifetimes */
|
/* Always commit to nm-platform to update lifetimes */
|
||||||
if (commit && new_config)
|
if (commit && new_config) {
|
||||||
success = nm_ip4_config_commit (new_config, ip_ifindex, nm_device_get_priority (self));
|
success = nm_ip4_config_commit (new_config, ip_ifindex, nm_device_get_priority (self));
|
||||||
|
if (!success)
|
||||||
if (nm_ip4_config_equal (new_config, old_config))
|
reason_local = NM_DEVICE_STATE_REASON_CONFIG_FAILED;
|
||||||
return success;
|
}
|
||||||
|
|
||||||
priv->ip4_config = NULL;
|
|
||||||
|
|
||||||
if (new_config) {
|
if (new_config) {
|
||||||
priv->ip4_config = g_object_ref (new_config);
|
if (old_config) {
|
||||||
|
/* has_changes is set only on relevant changes, because when the configuration changes,
|
||||||
|
* this causes a re-read and reset. This should only happen for relevant changes */
|
||||||
|
nm_ip4_config_replace (old_config, new_config, &has_changes);
|
||||||
|
if (has_changes) {
|
||||||
|
nm_log_dbg (LOGD_IP4, "(%s): update IP4Config instance (%s)",
|
||||||
|
ip_iface, nm_ip4_config_get_dbus_path (old_config));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
has_changes = TRUE;
|
||||||
|
priv->ip4_config = g_object_ref (new_config);
|
||||||
|
|
||||||
if (success || !commit) {
|
if (success && !nm_ip4_config_get_dbus_path (new_config)) {
|
||||||
/* Export over D-Bus */
|
/* Export over D-Bus */
|
||||||
if (!nm_ip4_config_get_dbus_path (new_config))
|
|
||||||
nm_ip4_config_export (new_config);
|
nm_ip4_config_export (new_config);
|
||||||
_update_ip4_address (self);
|
}
|
||||||
}
|
}
|
||||||
|
} else if (old_config) {
|
||||||
if (!success && reason)
|
has_changes = TRUE;
|
||||||
*reason = NM_DEVICE_STATE_REASON_CONFIG_FAILED;
|
priv->ip4_config = NULL;
|
||||||
} else {
|
nm_log_dbg (LOGD_IP4, "(%s): clear IP4Config instance (%s)",
|
||||||
|
ip_iface, nm_ip4_config_get_dbus_path (old_config));
|
||||||
/* Device config is invalid if combined config is invalid */
|
/* Device config is invalid if combined config is invalid */
|
||||||
g_clear_object (&priv->dev_ip4_config);
|
g_clear_object (&priv->dev_ip4_config);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_notify (G_OBJECT (self), NM_DEVICE_IP4_CONFIG);
|
if (has_changes) {
|
||||||
g_signal_emit (self, signals[IP4_CONFIG_CHANGED], 0, priv->ip4_config, old_config);
|
_update_ip4_address (self);
|
||||||
|
|
||||||
if (old_config)
|
if (old_config != priv->ip4_config)
|
||||||
g_object_unref (old_config);
|
g_object_notify (G_OBJECT (self), NM_DEVICE_IP4_CONFIG);
|
||||||
|
g_signal_emit (self, signals[IP4_CONFIG_CHANGED], 0, priv->ip4_config, old_config);
|
||||||
|
|
||||||
|
if (old_config != priv->ip4_config && old_config)
|
||||||
|
g_object_unref (old_config);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reason)
|
||||||
|
*reason = reason_local;
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
@ -4632,7 +4650,9 @@ nm_device_set_ip6_config (NMDevice *self,
|
||||||
NMDevicePrivate *priv;
|
NMDevicePrivate *priv;
|
||||||
const char *ip_iface;
|
const char *ip_iface;
|
||||||
NMIP6Config *old_config = NULL;
|
NMIP6Config *old_config = NULL;
|
||||||
|
gboolean has_changes = FALSE;
|
||||||
gboolean success = TRUE;
|
gboolean success = TRUE;
|
||||||
|
NMDeviceStateReason reason_local = NM_DEVICE_STATE_REASON_NONE;
|
||||||
int ip_ifindex;
|
int ip_ifindex;
|
||||||
|
|
||||||
g_return_val_if_fail (NM_IS_DEVICE (self), FALSE);
|
g_return_val_if_fail (NM_IS_DEVICE (self), FALSE);
|
||||||
|
@ -4644,32 +4664,48 @@ nm_device_set_ip6_config (NMDevice *self,
|
||||||
old_config = priv->ip6_config;
|
old_config = priv->ip6_config;
|
||||||
|
|
||||||
/* Always commit to nm-platform to update lifetimes */
|
/* Always commit to nm-platform to update lifetimes */
|
||||||
if (commit && new_config)
|
if (commit && new_config) {
|
||||||
success = nm_ip6_config_commit (new_config, ip_ifindex, nm_device_get_priority (self));
|
success = nm_ip6_config_commit (new_config, ip_ifindex, nm_device_get_priority (self));
|
||||||
|
if (!success)
|
||||||
if (nm_ip6_config_equal (new_config, old_config))
|
reason_local = NM_DEVICE_STATE_REASON_CONFIG_FAILED;
|
||||||
return success;
|
|
||||||
|
|
||||||
priv->ip6_config = NULL;
|
|
||||||
|
|
||||||
if (new_config) {
|
|
||||||
priv->ip6_config = g_object_ref (new_config);
|
|
||||||
|
|
||||||
if (success || !commit) {
|
|
||||||
/* Export over D-Bus */
|
|
||||||
if (!nm_ip6_config_get_dbus_path (new_config))
|
|
||||||
nm_ip6_config_export (new_config);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!success && reason)
|
|
||||||
*reason = NM_DEVICE_STATE_REASON_CONFIG_FAILED;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
g_object_notify (G_OBJECT (self), NM_DEVICE_IP6_CONFIG);
|
if (new_config) {
|
||||||
g_signal_emit (self, signals[IP6_CONFIG_CHANGED], 0, priv->ip6_config, old_config);
|
if (old_config) {
|
||||||
|
/* has_changes is set only on relevant changes, because when the configuration changes,
|
||||||
|
* this causes a re-read and reset. This should only happen for relevant changes */
|
||||||
|
nm_ip6_config_replace (old_config, new_config, &has_changes);
|
||||||
|
if (has_changes) {
|
||||||
|
nm_log_dbg (LOGD_IP6, "(%s): update IP6Config instance (%s)",
|
||||||
|
ip_iface, nm_ip6_config_get_dbus_path (old_config));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
has_changes = TRUE;
|
||||||
|
priv->ip6_config = g_object_ref (new_config);
|
||||||
|
|
||||||
if (old_config)
|
if (success && !nm_ip6_config_get_dbus_path (new_config)) {
|
||||||
g_object_unref (old_config);
|
/* Export over D-Bus */
|
||||||
|
nm_ip6_config_export (new_config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (old_config) {
|
||||||
|
has_changes = TRUE;
|
||||||
|
priv->ip6_config = NULL;
|
||||||
|
nm_log_dbg (LOGD_IP6, "(%s): clear IP6Config instance (%s)",
|
||||||
|
ip_iface, nm_ip6_config_get_dbus_path (old_config));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (has_changes) {
|
||||||
|
if (old_config != priv->ip6_config)
|
||||||
|
g_object_notify (G_OBJECT (self), NM_DEVICE_IP6_CONFIG);
|
||||||
|
g_signal_emit (self, signals[IP6_CONFIG_CHANGED], 0, priv->ip6_config, old_config);
|
||||||
|
|
||||||
|
if (old_config != priv->ip6_config && old_config)
|
||||||
|
g_object_unref (old_config);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (reason)
|
||||||
|
*reason = reason_local;
|
||||||
|
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,17 +53,24 @@ typedef struct {
|
||||||
guint32 mtu;
|
guint32 mtu;
|
||||||
} NMIP4ConfigPrivate;
|
} NMIP4ConfigPrivate;
|
||||||
|
|
||||||
|
/* internal guint32 are assigned to gobject properties of type uint. Ensure, that uint is large enough */
|
||||||
|
G_STATIC_ASSERT (sizeof (uint) >= sizeof (guint32));
|
||||||
|
G_STATIC_ASSERT (G_MAXUINT >= 0xFFFFFFFF);
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
PROP_0,
|
PROP_0,
|
||||||
|
PROP_GATEWAY,
|
||||||
PROP_ADDRESSES,
|
PROP_ADDRESSES,
|
||||||
|
PROP_ROUTES,
|
||||||
PROP_NAMESERVERS,
|
PROP_NAMESERVERS,
|
||||||
PROP_DOMAINS,
|
PROP_DOMAINS,
|
||||||
PROP_ROUTES,
|
PROP_SEARCHES,
|
||||||
PROP_WINS_SERVERS,
|
PROP_WINS_SERVERS,
|
||||||
|
|
||||||
LAST_PROP
|
LAST_PROP
|
||||||
};
|
};
|
||||||
|
static GParamSpec *obj_properties[LAST_PROP] = { NULL, };
|
||||||
|
#define _NOTIFY(config, prop) G_STMT_START { g_object_notify_by_pspec (G_OBJECT (config), obj_properties[prop]); } G_STMT_END
|
||||||
|
|
||||||
|
|
||||||
NMIP4Config *
|
NMIP4Config *
|
||||||
|
@ -129,6 +136,10 @@ nm_ip4_config_capture (int ifindex)
|
||||||
priv->addresses = nm_platform_ip4_address_get_all (ifindex);
|
priv->addresses = nm_platform_ip4_address_get_all (ifindex);
|
||||||
priv->routes = nm_platform_ip4_route_get_all (ifindex, FALSE);
|
priv->routes = nm_platform_ip4_route_get_all (ifindex, FALSE);
|
||||||
|
|
||||||
|
/* actually, nobody should be connected to the signal, just to be sure, notify */
|
||||||
|
_NOTIFY (config, PROP_ADDRESSES);
|
||||||
|
_NOTIFY (config, PROP_ROUTES);
|
||||||
|
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,6 +204,8 @@ nm_ip4_config_merge_setting (NMIP4Config *config, NMSettingIP4Config *setting)
|
||||||
if (!setting)
|
if (!setting)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
g_object_freeze_notify (G_OBJECT (config));
|
||||||
|
|
||||||
naddresses = nm_setting_ip4_config_get_num_addresses (setting);
|
naddresses = nm_setting_ip4_config_get_num_addresses (setting);
|
||||||
nroutes = nm_setting_ip4_config_get_num_routes (setting);
|
nroutes = nm_setting_ip4_config_get_num_routes (setting);
|
||||||
nnameservers = nm_setting_ip4_config_get_num_dns (setting);
|
nnameservers = nm_setting_ip4_config_get_num_dns (setting);
|
||||||
|
@ -252,6 +265,8 @@ nm_ip4_config_merge_setting (NMIP4Config *config, NMSettingIP4Config *setting)
|
||||||
nm_ip4_config_add_nameserver (config, nm_setting_ip4_config_get_dns (setting, i));
|
nm_ip4_config_add_nameserver (config, nm_setting_ip4_config_get_dns (setting, i));
|
||||||
for (i = 0; i < nsearches; i++)
|
for (i = 0; i < nsearches; i++)
|
||||||
nm_ip4_config_add_search (config, nm_setting_ip4_config_get_dns_search (setting, i));
|
nm_ip4_config_add_search (config, nm_setting_ip4_config_get_dns_search (setting, i));
|
||||||
|
|
||||||
|
g_object_thaw_notify (G_OBJECT (config));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -345,6 +360,8 @@ nm_ip4_config_merge (NMIP4Config *dst, NMIP4Config *src)
|
||||||
g_return_if_fail (src != NULL);
|
g_return_if_fail (src != NULL);
|
||||||
g_return_if_fail (dst != NULL);
|
g_return_if_fail (dst != NULL);
|
||||||
|
|
||||||
|
g_object_freeze_notify (G_OBJECT (dst));
|
||||||
|
|
||||||
/* addresses */
|
/* addresses */
|
||||||
for (i = 0; i < nm_ip4_config_get_num_addresses (src); i++)
|
for (i = 0; i < nm_ip4_config_get_num_addresses (src); i++)
|
||||||
nm_ip4_config_add_address (dst, nm_ip4_config_get_address (src, i));
|
nm_ip4_config_add_address (dst, nm_ip4_config_get_address (src, i));
|
||||||
|
@ -386,6 +403,8 @@ nm_ip4_config_merge (NMIP4Config *dst, NMIP4Config *src)
|
||||||
/* WINS */
|
/* WINS */
|
||||||
for (i = 0; i < nm_ip4_config_get_num_wins (src); i++)
|
for (i = 0; i < nm_ip4_config_get_num_wins (src); i++)
|
||||||
nm_ip4_config_add_wins (dst, nm_ip4_config_get_wins (src, i));
|
nm_ip4_config_add_wins (dst, nm_ip4_config_get_wins (src, i));
|
||||||
|
|
||||||
|
g_object_thaw_notify (G_OBJECT (dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -403,6 +422,8 @@ nm_ip4_config_subtract (NMIP4Config *dst, NMIP4Config *src)
|
||||||
g_return_if_fail (src != NULL);
|
g_return_if_fail (src != NULL);
|
||||||
g_return_if_fail (dst != NULL);
|
g_return_if_fail (dst != NULL);
|
||||||
|
|
||||||
|
g_object_freeze_notify (G_OBJECT (dst));
|
||||||
|
|
||||||
/* addresses */
|
/* addresses */
|
||||||
for (i = 0; i < nm_ip4_config_get_num_addresses (src); i++) {
|
for (i = 0; i < nm_ip4_config_get_num_addresses (src); i++) {
|
||||||
const NMPlatformIP4Address *src_addr = nm_ip4_config_get_address (src, i);
|
const NMPlatformIP4Address *src_addr = nm_ip4_config_get_address (src, i);
|
||||||
|
@ -515,6 +536,8 @@ nm_ip4_config_subtract (NMIP4Config *dst, NMIP4Config *src)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_object_thaw_notify (G_OBJECT (dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -555,6 +578,8 @@ nm_ip4_config_replace (NMIP4Config *dst, NMIP4Config *src, gboolean *relevant_ch
|
||||||
dst_priv = NM_IP4_CONFIG_GET_PRIVATE (dst);
|
dst_priv = NM_IP4_CONFIG_GET_PRIVATE (dst);
|
||||||
src_priv = NM_IP4_CONFIG_GET_PRIVATE (src);
|
src_priv = NM_IP4_CONFIG_GET_PRIVATE (src);
|
||||||
|
|
||||||
|
g_object_freeze_notify (G_OBJECT (dst));
|
||||||
|
|
||||||
/* never_default */
|
/* never_default */
|
||||||
if (src_priv->never_default != dst_priv->never_default) {
|
if (src_priv->never_default != dst_priv->never_default) {
|
||||||
dst_priv->never_default = src_priv->never_default;
|
dst_priv->never_default = src_priv->never_default;
|
||||||
|
@ -733,6 +758,8 @@ nm_ip4_config_replace (NMIP4Config *dst, NMIP4Config *src, gboolean *relevant_ch
|
||||||
* regardless of config_equal. But config_equal must correspond to has_relevant_changes. */
|
* regardless of config_equal. But config_equal must correspond to has_relevant_changes. */
|
||||||
g_assert (config_equal == !has_relevant_changes);
|
g_assert (config_equal == !has_relevant_changes);
|
||||||
|
|
||||||
|
g_object_thaw_notify (G_OBJECT (dst));
|
||||||
|
|
||||||
if (relevant_changes)
|
if (relevant_changes)
|
||||||
*relevant_changes = has_relevant_changes;
|
*relevant_changes = has_relevant_changes;
|
||||||
|
|
||||||
|
@ -856,7 +883,10 @@ nm_ip4_config_set_gateway (NMIP4Config *config, guint32 gateway)
|
||||||
{
|
{
|
||||||
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
|
||||||
|
|
||||||
priv->gateway = gateway;
|
if (priv->gateway != gateway) {
|
||||||
|
priv->gateway = gateway;
|
||||||
|
_NOTIFY (config, PROP_GATEWAY);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
guint32
|
guint32
|
||||||
|
@ -874,7 +904,10 @@ nm_ip4_config_reset_addresses (NMIP4Config *config)
|
||||||
{
|
{
|
||||||
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
|
||||||
|
|
||||||
g_array_set_size (priv->addresses, 0);
|
if (priv->addresses->len != 0) {
|
||||||
|
g_array_set_size (priv->addresses, 0);
|
||||||
|
_NOTIFY (config, PROP_ADDRESSES);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -889,12 +922,16 @@ nm_ip4_config_add_address (NMIP4Config *config, const NMPlatformIP4Address *new)
|
||||||
NMPlatformIP4Address *item = &g_array_index (priv->addresses, NMPlatformIP4Address, i);
|
NMPlatformIP4Address *item = &g_array_index (priv->addresses, NMPlatformIP4Address, i);
|
||||||
|
|
||||||
if (addresses_are_duplicate (item, new, FALSE)) {
|
if (addresses_are_duplicate (item, new, FALSE)) {
|
||||||
|
if (nm_platform_ip4_address_cmp (item, new) == 0)
|
||||||
|
return;
|
||||||
memcpy (item, new, sizeof (*item));
|
memcpy (item, new, sizeof (*item));
|
||||||
return;
|
goto NOTIFY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g_array_append_val (priv->addresses, *new);
|
g_array_append_val (priv->addresses, *new);
|
||||||
|
NOTIFY:
|
||||||
|
_NOTIFY (config, PROP_ADDRESSES);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -905,6 +942,7 @@ nm_ip4_config_del_address (NMIP4Config *config, guint i)
|
||||||
g_return_if_fail (i < priv->addresses->len);
|
g_return_if_fail (i < priv->addresses->len);
|
||||||
|
|
||||||
g_array_remove_index (priv->addresses, i);
|
g_array_remove_index (priv->addresses, i);
|
||||||
|
_NOTIFY (config, PROP_ADDRESSES);
|
||||||
}
|
}
|
||||||
|
|
||||||
guint
|
guint
|
||||||
|
@ -930,7 +968,10 @@ nm_ip4_config_reset_routes (NMIP4Config *config)
|
||||||
{
|
{
|
||||||
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
|
||||||
|
|
||||||
g_array_set_size (priv->routes, 0);
|
if (priv->routes->len != 0) {
|
||||||
|
g_array_set_size (priv->routes, 0);
|
||||||
|
_NOTIFY (config, PROP_ROUTES);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -945,12 +986,16 @@ nm_ip4_config_add_route (NMIP4Config *config, const NMPlatformIP4Route *new)
|
||||||
NMPlatformIP4Route *item = &g_array_index (priv->routes, NMPlatformIP4Route, i);
|
NMPlatformIP4Route *item = &g_array_index (priv->routes, NMPlatformIP4Route, i);
|
||||||
|
|
||||||
if (routes_are_duplicate (item, new, FALSE)) {
|
if (routes_are_duplicate (item, new, FALSE)) {
|
||||||
|
if (nm_platform_ip4_route_cmp (item, new) == 0)
|
||||||
|
return;
|
||||||
memcpy (item, new, sizeof (*item));
|
memcpy (item, new, sizeof (*item));
|
||||||
return;
|
goto NOTIFY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g_array_append_val (priv->routes, *new);
|
g_array_append_val (priv->routes, *new);
|
||||||
|
NOTIFY:
|
||||||
|
_NOTIFY (config, PROP_ROUTES);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -961,6 +1006,7 @@ nm_ip4_config_del_route (NMIP4Config *config, guint i)
|
||||||
g_return_if_fail (i < priv->routes->len);
|
g_return_if_fail (i < priv->routes->len);
|
||||||
|
|
||||||
g_array_remove_index (priv->routes, i);
|
g_array_remove_index (priv->routes, i);
|
||||||
|
_NOTIFY (config, PROP_ROUTES);
|
||||||
}
|
}
|
||||||
|
|
||||||
guint
|
guint
|
||||||
|
@ -986,7 +1032,10 @@ nm_ip4_config_reset_nameservers (NMIP4Config *config)
|
||||||
{
|
{
|
||||||
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
|
||||||
|
|
||||||
g_array_set_size (priv->nameservers, 0);
|
if (priv->nameservers->len != 0) {
|
||||||
|
g_array_set_size (priv->nameservers, 0);
|
||||||
|
_NOTIFY (config, PROP_NAMESERVERS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1002,6 +1051,7 @@ nm_ip4_config_add_nameserver (NMIP4Config *config, guint32 new)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_array_append_val (priv->nameservers, new);
|
g_array_append_val (priv->nameservers, new);
|
||||||
|
_NOTIFY (config, PROP_NAMESERVERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1012,6 +1062,7 @@ nm_ip4_config_del_nameserver (NMIP4Config *config, guint i)
|
||||||
g_return_if_fail (i < priv->nameservers->len);
|
g_return_if_fail (i < priv->nameservers->len);
|
||||||
|
|
||||||
g_array_remove_index (priv->nameservers, i);
|
g_array_remove_index (priv->nameservers, i);
|
||||||
|
_NOTIFY (config, PROP_NAMESERVERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
guint32
|
guint32
|
||||||
|
@ -1037,7 +1088,10 @@ nm_ip4_config_reset_domains (NMIP4Config *config)
|
||||||
{
|
{
|
||||||
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
|
||||||
|
|
||||||
g_ptr_array_set_size (priv->domains, 0);
|
if (priv->domains->len != 0) {
|
||||||
|
g_ptr_array_set_size (priv->domains, 0);
|
||||||
|
_NOTIFY (config, PROP_DOMAINS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1054,6 +1108,7 @@ nm_ip4_config_add_domain (NMIP4Config *config, const char *domain)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_ptr_array_add (priv->domains, g_strdup (domain));
|
g_ptr_array_add (priv->domains, g_strdup (domain));
|
||||||
|
_NOTIFY (config, PROP_DOMAINS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1064,6 +1119,7 @@ nm_ip4_config_del_domain (NMIP4Config *config, guint i)
|
||||||
g_return_if_fail (i < priv->domains->len);
|
g_return_if_fail (i < priv->domains->len);
|
||||||
|
|
||||||
g_ptr_array_remove_index (priv->domains, i);
|
g_ptr_array_remove_index (priv->domains, i);
|
||||||
|
_NOTIFY (config, PROP_DOMAINS);
|
||||||
}
|
}
|
||||||
|
|
||||||
guint32
|
guint32
|
||||||
|
@ -1089,7 +1145,10 @@ nm_ip4_config_reset_searches (NMIP4Config *config)
|
||||||
{
|
{
|
||||||
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
|
||||||
|
|
||||||
g_ptr_array_set_size (priv->searches, 0);
|
if (priv->searches->len != 0) {
|
||||||
|
g_ptr_array_set_size (priv->searches, 0);
|
||||||
|
_NOTIFY (config, PROP_SEARCHES);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1106,6 +1165,7 @@ nm_ip4_config_add_search (NMIP4Config *config, const char *new)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_ptr_array_add (priv->searches, g_strdup (new));
|
g_ptr_array_add (priv->searches, g_strdup (new));
|
||||||
|
_NOTIFY (config, PROP_SEARCHES);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1116,6 +1176,7 @@ nm_ip4_config_del_search (NMIP4Config *config, guint i)
|
||||||
g_return_if_fail (i < priv->searches->len);
|
g_return_if_fail (i < priv->searches->len);
|
||||||
|
|
||||||
g_ptr_array_remove_index (priv->searches, i);
|
g_ptr_array_remove_index (priv->searches, i);
|
||||||
|
_NOTIFY (config, PROP_SEARCHES);
|
||||||
}
|
}
|
||||||
|
|
||||||
guint32
|
guint32
|
||||||
|
@ -1243,7 +1304,10 @@ nm_ip4_config_reset_wins (NMIP4Config *config)
|
||||||
{
|
{
|
||||||
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
|
||||||
|
|
||||||
g_array_set_size (priv->wins, 0);
|
if (priv->wins->len != 0) {
|
||||||
|
g_array_set_size (priv->wins, 0);
|
||||||
|
_NOTIFY (config, PROP_WINS_SERVERS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1259,6 +1323,7 @@ nm_ip4_config_add_wins (NMIP4Config *config, guint32 wins)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_array_append_val (priv->wins, wins);
|
g_array_append_val (priv->wins, wins);
|
||||||
|
_NOTIFY (config, PROP_WINS_SERVERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1269,6 +1334,7 @@ nm_ip4_config_del_wins (NMIP4Config *config, guint i)
|
||||||
g_return_if_fail (i < priv->wins->len);
|
g_return_if_fail (i < priv->wins->len);
|
||||||
|
|
||||||
g_array_remove_index (priv->wins, i);
|
g_array_remove_index (priv->wins, i);
|
||||||
|
_NOTIFY (config, PROP_WINS_SERVERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
guint32
|
guint32
|
||||||
|
@ -1435,9 +1501,15 @@ get_property (GObject *object, guint prop_id,
|
||||||
{
|
{
|
||||||
NMIP4Config *config = NM_IP4_CONFIG (object);
|
NMIP4Config *config = NM_IP4_CONFIG (object);
|
||||||
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (object);
|
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (object);
|
||||||
in_addr_t gateway = nm_ip4_config_get_gateway (config);
|
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
|
case PROP_GATEWAY:
|
||||||
|
if (priv->gateway) {
|
||||||
|
char addr_buf[INET_ADDRSTRLEN];
|
||||||
|
g_value_set_string (value, inet_ntop (AF_INET, &priv->gateway, addr_buf, sizeof (addr_buf)));
|
||||||
|
} else
|
||||||
|
g_value_set_string (value, NULL);
|
||||||
|
break;
|
||||||
case PROP_ADDRESSES:
|
case PROP_ADDRESSES:
|
||||||
{
|
{
|
||||||
GPtrArray *addresses = g_ptr_array_new ();
|
GPtrArray *addresses = g_ptr_array_new ();
|
||||||
|
@ -1450,7 +1522,7 @@ get_property (GObject *object, guint prop_id,
|
||||||
|
|
||||||
g_array_append_val (array, address->address);
|
g_array_append_val (array, address->address);
|
||||||
g_array_append_val (array, address->plen);
|
g_array_append_val (array, address->plen);
|
||||||
g_array_append_val (array, gateway);
|
g_array_append_val (array, priv->gateway);
|
||||||
|
|
||||||
g_ptr_array_add (addresses, array);
|
g_ptr_array_add (addresses, array);
|
||||||
}
|
}
|
||||||
|
@ -1485,6 +1557,9 @@ get_property (GObject *object, guint prop_id,
|
||||||
case PROP_DOMAINS:
|
case PROP_DOMAINS:
|
||||||
g_value_set_boxed (value, priv->domains);
|
g_value_set_boxed (value, priv->domains);
|
||||||
break;
|
break;
|
||||||
|
case PROP_SEARCHES:
|
||||||
|
g_value_set_boxed (value, priv->searches);
|
||||||
|
break;
|
||||||
case PROP_WINS_SERVERS:
|
case PROP_WINS_SERVERS:
|
||||||
g_value_set_boxed (value, priv->wins);
|
g_value_set_boxed (value, priv->wins);
|
||||||
break;
|
break;
|
||||||
|
@ -1504,41 +1579,50 @@ nm_ip4_config_class_init (NMIP4ConfigClass *config_class)
|
||||||
object_class->get_property = get_property;
|
object_class->get_property = get_property;
|
||||||
object_class->finalize = finalize;
|
object_class->finalize = finalize;
|
||||||
|
|
||||||
g_object_class_install_property
|
obj_properties[PROP_GATEWAY] =
|
||||||
(object_class, PROP_ADDRESSES,
|
g_param_spec_string (NM_IP4_CONFIG_GATEWAY,
|
||||||
|
"Gateway",
|
||||||
|
"IP4 gateway",
|
||||||
|
NULL,
|
||||||
|
G_PARAM_READABLE);
|
||||||
|
obj_properties[PROP_ADDRESSES] =
|
||||||
g_param_spec_boxed (NM_IP4_CONFIG_ADDRESSES,
|
g_param_spec_boxed (NM_IP4_CONFIG_ADDRESSES,
|
||||||
"Addresses",
|
"Addresses",
|
||||||
"IP4 addresses",
|
"IP4 addresses",
|
||||||
DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT,
|
DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT,
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE);
|
||||||
g_object_class_install_property
|
obj_properties[PROP_ROUTES] =
|
||||||
(object_class, PROP_ROUTES,
|
|
||||||
g_param_spec_boxed (NM_IP4_CONFIG_ROUTES,
|
g_param_spec_boxed (NM_IP4_CONFIG_ROUTES,
|
||||||
"Routes",
|
"Routes",
|
||||||
"Routes",
|
"Routes",
|
||||||
DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT,
|
DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UINT,
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE);
|
||||||
g_object_class_install_property
|
obj_properties[PROP_NAMESERVERS] =
|
||||||
(object_class, PROP_NAMESERVERS,
|
|
||||||
g_param_spec_boxed (NM_IP4_CONFIG_NAMESERVERS,
|
g_param_spec_boxed (NM_IP4_CONFIG_NAMESERVERS,
|
||||||
"Nameservers",
|
"Nameservers",
|
||||||
"DNS list",
|
"DNS list",
|
||||||
DBUS_TYPE_G_UINT_ARRAY,
|
DBUS_TYPE_G_UINT_ARRAY,
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE);
|
||||||
g_object_class_install_property
|
obj_properties[PROP_DOMAINS] =
|
||||||
(object_class, PROP_DOMAINS,
|
|
||||||
g_param_spec_boxed (NM_IP4_CONFIG_DOMAINS,
|
g_param_spec_boxed (NM_IP4_CONFIG_DOMAINS,
|
||||||
"Domains",
|
"Domains",
|
||||||
"Domains",
|
"Domains",
|
||||||
DBUS_TYPE_G_ARRAY_OF_STRING,
|
DBUS_TYPE_G_ARRAY_OF_STRING,
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE);
|
||||||
g_object_class_install_property
|
obj_properties[PROP_SEARCHES] =
|
||||||
(object_class, PROP_WINS_SERVERS,
|
g_param_spec_boxed (NM_IP4_CONFIG_SEARCHES,
|
||||||
|
"Searches",
|
||||||
|
"Searches",
|
||||||
|
DBUS_TYPE_G_ARRAY_OF_STRING,
|
||||||
|
G_PARAM_READABLE);
|
||||||
|
obj_properties[PROP_WINS_SERVERS] =
|
||||||
g_param_spec_boxed (NM_IP4_CONFIG_WINS_SERVERS,
|
g_param_spec_boxed (NM_IP4_CONFIG_WINS_SERVERS,
|
||||||
"WinsServers",
|
"WinsServers",
|
||||||
"WINS server list",
|
"WINS server list",
|
||||||
DBUS_TYPE_G_UINT_ARRAY,
|
DBUS_TYPE_G_UINT_ARRAY,
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE);
|
||||||
|
|
||||||
|
g_object_class_install_properties (object_class, LAST_PROP, obj_properties);
|
||||||
|
|
||||||
dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (config_class), &dbus_glib_nm_ip4_config_object_info);
|
dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (config_class), &dbus_glib_nm_ip4_config_object_info);
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,10 +41,12 @@ typedef struct {
|
||||||
GObjectClass parent;
|
GObjectClass parent;
|
||||||
} NMIP4ConfigClass;
|
} NMIP4ConfigClass;
|
||||||
|
|
||||||
|
#define NM_IP4_CONFIG_GATEWAY "gateway"
|
||||||
#define NM_IP4_CONFIG_ADDRESSES "addresses"
|
#define NM_IP4_CONFIG_ADDRESSES "addresses"
|
||||||
|
#define NM_IP4_CONFIG_ROUTES "routes"
|
||||||
#define NM_IP4_CONFIG_NAMESERVERS "nameservers"
|
#define NM_IP4_CONFIG_NAMESERVERS "nameservers"
|
||||||
#define NM_IP4_CONFIG_DOMAINS "domains"
|
#define NM_IP4_CONFIG_DOMAINS "domains"
|
||||||
#define NM_IP4_CONFIG_ROUTES "routes"
|
#define NM_IP4_CONFIG_SEARCHES "searches"
|
||||||
#define NM_IP4_CONFIG_WINS_SERVERS "wins-servers"
|
#define NM_IP4_CONFIG_WINS_SERVERS "wins-servers"
|
||||||
|
|
||||||
GType nm_ip4_config_get_type (void);
|
GType nm_ip4_config_get_type (void);
|
||||||
|
|
|
@ -52,13 +52,17 @@ typedef struct {
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
PROP_0,
|
PROP_0,
|
||||||
|
PROP_GATEWAY,
|
||||||
PROP_ADDRESSES,
|
PROP_ADDRESSES,
|
||||||
|
PROP_ROUTES,
|
||||||
PROP_NAMESERVERS,
|
PROP_NAMESERVERS,
|
||||||
PROP_DOMAINS,
|
PROP_DOMAINS,
|
||||||
PROP_ROUTES,
|
PROP_SEARCHES,
|
||||||
|
|
||||||
LAST_PROP
|
LAST_PROP
|
||||||
};
|
};
|
||||||
|
static GParamSpec *obj_properties[LAST_PROP] = { NULL, };
|
||||||
|
#define _NOTIFY(config, prop) G_STMT_START { g_object_notify_by_pspec (G_OBJECT (config), obj_properties[prop]); } G_STMT_END
|
||||||
|
|
||||||
|
|
||||||
NMIP6Config *
|
NMIP6Config *
|
||||||
|
@ -132,6 +136,10 @@ nm_ip6_config_capture (int ifindex)
|
||||||
priv->addresses = nm_platform_ip6_address_get_all (ifindex);
|
priv->addresses = nm_platform_ip6_address_get_all (ifindex);
|
||||||
priv->routes = nm_platform_ip6_route_get_all (ifindex, FALSE);
|
priv->routes = nm_platform_ip6_route_get_all (ifindex, FALSE);
|
||||||
|
|
||||||
|
/* actually, nobody should be connected to the signal, just to be sure, notify */
|
||||||
|
_NOTIFY (config, PROP_ADDRESSES);
|
||||||
|
_NOTIFY (config, PROP_ROUTES);
|
||||||
|
|
||||||
return config;
|
return config;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -194,6 +202,8 @@ nm_ip6_config_merge_setting (NMIP6Config *config, NMSettingIP6Config *setting)
|
||||||
nnameservers = nm_setting_ip6_config_get_num_dns (setting);
|
nnameservers = nm_setting_ip6_config_get_num_dns (setting);
|
||||||
nsearches = nm_setting_ip6_config_get_num_dns_searches (setting);
|
nsearches = nm_setting_ip6_config_get_num_dns_searches (setting);
|
||||||
|
|
||||||
|
g_object_freeze_notify (G_OBJECT (config));
|
||||||
|
|
||||||
/* Gateway */
|
/* Gateway */
|
||||||
if (nm_setting_ip6_config_get_never_default (setting))
|
if (nm_setting_ip6_config_get_never_default (setting))
|
||||||
nm_ip6_config_set_never_default (config, TRUE);
|
nm_ip6_config_set_never_default (config, TRUE);
|
||||||
|
@ -248,6 +258,8 @@ nm_ip6_config_merge_setting (NMIP6Config *config, NMSettingIP6Config *setting)
|
||||||
nm_ip6_config_add_nameserver (config, nm_setting_ip6_config_get_dns (setting, i));
|
nm_ip6_config_add_nameserver (config, nm_setting_ip6_config_get_dns (setting, i));
|
||||||
for (i = 0; i < nsearches; i++)
|
for (i = 0; i < nsearches; i++)
|
||||||
nm_ip6_config_add_search (config, nm_setting_ip6_config_get_dns_search (setting, i));
|
nm_ip6_config_add_search (config, nm_setting_ip6_config_get_dns_search (setting, i));
|
||||||
|
|
||||||
|
g_object_thaw_notify (G_OBJECT (config));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -345,6 +357,8 @@ nm_ip6_config_merge (NMIP6Config *dst, NMIP6Config *src)
|
||||||
g_return_if_fail (src != NULL);
|
g_return_if_fail (src != NULL);
|
||||||
g_return_if_fail (dst != NULL);
|
g_return_if_fail (dst != NULL);
|
||||||
|
|
||||||
|
g_object_freeze_notify (G_OBJECT (dst));
|
||||||
|
|
||||||
/* addresses */
|
/* addresses */
|
||||||
for (i = 0; i < nm_ip6_config_get_num_addresses (src); i++)
|
for (i = 0; i < nm_ip6_config_get_num_addresses (src); i++)
|
||||||
nm_ip6_config_add_address (dst, nm_ip6_config_get_address (src, i));
|
nm_ip6_config_add_address (dst, nm_ip6_config_get_address (src, i));
|
||||||
|
@ -375,6 +389,8 @@ nm_ip6_config_merge (NMIP6Config *dst, NMIP6Config *src)
|
||||||
|
|
||||||
if (!nm_ip6_config_get_mss (dst))
|
if (!nm_ip6_config_get_mss (dst))
|
||||||
nm_ip6_config_set_mss (dst, nm_ip6_config_get_mss (src));
|
nm_ip6_config_set_mss (dst, nm_ip6_config_get_mss (src));
|
||||||
|
|
||||||
|
g_object_thaw_notify (G_OBJECT (dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
|
@ -409,6 +425,8 @@ nm_ip6_config_subtract (NMIP6Config *dst, NMIP6Config *src)
|
||||||
g_return_if_fail (src != NULL);
|
g_return_if_fail (src != NULL);
|
||||||
g_return_if_fail (dst != NULL);
|
g_return_if_fail (dst != NULL);
|
||||||
|
|
||||||
|
g_object_freeze_notify (G_OBJECT (dst));
|
||||||
|
|
||||||
/* addresses */
|
/* addresses */
|
||||||
for (i = 0; i < nm_ip6_config_get_num_addresses (src); i++) {
|
for (i = 0; i < nm_ip6_config_get_num_addresses (src); i++) {
|
||||||
const NMPlatformIP6Address *src_addr = nm_ip6_config_get_address (src, i);
|
const NMPlatformIP6Address *src_addr = nm_ip6_config_get_address (src, i);
|
||||||
|
@ -493,6 +511,8 @@ nm_ip6_config_subtract (NMIP6Config *dst, NMIP6Config *src)
|
||||||
|
|
||||||
if (nm_ip6_config_get_mss (src) == nm_ip6_config_get_mss (dst))
|
if (nm_ip6_config_get_mss (src) == nm_ip6_config_get_mss (dst))
|
||||||
nm_ip6_config_set_mss (dst, 0);
|
nm_ip6_config_set_mss (dst, 0);
|
||||||
|
|
||||||
|
g_object_thaw_notify (G_OBJECT (dst));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -532,6 +552,8 @@ nm_ip6_config_replace (NMIP6Config *dst, NMIP6Config *src, gboolean *relevant_ch
|
||||||
dst_priv = NM_IP6_CONFIG_GET_PRIVATE (dst);
|
dst_priv = NM_IP6_CONFIG_GET_PRIVATE (dst);
|
||||||
src_priv = NM_IP6_CONFIG_GET_PRIVATE (src);
|
src_priv = NM_IP6_CONFIG_GET_PRIVATE (src);
|
||||||
|
|
||||||
|
g_object_freeze_notify (G_OBJECT (dst));
|
||||||
|
|
||||||
/* never_default */
|
/* never_default */
|
||||||
if (src_priv->never_default != dst_priv->never_default) {
|
if (src_priv->never_default != dst_priv->never_default) {
|
||||||
dst_priv->never_default = src_priv->never_default;
|
dst_priv->never_default = src_priv->never_default;
|
||||||
|
@ -663,6 +685,8 @@ nm_ip6_config_replace (NMIP6Config *dst, NMIP6Config *src, gboolean *relevant_ch
|
||||||
* regardless of config_equal. But config_equal must correspond to has_relevant_changes. */
|
* regardless of config_equal. But config_equal must correspond to has_relevant_changes. */
|
||||||
g_assert (config_equal == !has_relevant_changes);
|
g_assert (config_equal == !has_relevant_changes);
|
||||||
|
|
||||||
|
g_object_thaw_notify (G_OBJECT (dst));
|
||||||
|
|
||||||
if (relevant_changes)
|
if (relevant_changes)
|
||||||
*relevant_changes = has_relevant_changes;
|
*relevant_changes = has_relevant_changes;
|
||||||
|
|
||||||
|
@ -692,10 +716,16 @@ nm_ip6_config_set_gateway (NMIP6Config *config, const struct in6_addr *gateway)
|
||||||
{
|
{
|
||||||
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
|
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
|
||||||
|
|
||||||
if (gateway)
|
if (gateway) {
|
||||||
memcpy (&priv->gateway, gateway, sizeof (priv->gateway));
|
if (IN6_ARE_ADDR_EQUAL (&priv->gateway, gateway))
|
||||||
else
|
return;
|
||||||
|
priv->gateway = *gateway;
|
||||||
|
} else {
|
||||||
|
if (IN6_IS_ADDR_UNSPECIFIED (&priv->gateway))
|
||||||
|
return;
|
||||||
memset (&priv->gateway, 0, sizeof (priv->gateway));
|
memset (&priv->gateway, 0, sizeof (priv->gateway));
|
||||||
|
}
|
||||||
|
_NOTIFY (config, PROP_GATEWAY);
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct in6_addr *
|
const struct in6_addr *
|
||||||
|
@ -713,7 +743,10 @@ nm_ip6_config_reset_addresses (NMIP6Config *config)
|
||||||
{
|
{
|
||||||
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
|
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
|
||||||
|
|
||||||
g_array_set_size (priv->addresses, 0);
|
if (priv->addresses->len != 0) {
|
||||||
|
g_array_set_size (priv->addresses, 0);
|
||||||
|
_NOTIFY (config, PROP_ADDRESSES);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -728,13 +761,17 @@ nm_ip6_config_add_address (NMIP6Config *config, const NMPlatformIP6Address *new)
|
||||||
NMPlatformIP6Address *item = &g_array_index (priv->addresses, NMPlatformIP6Address, i);
|
NMPlatformIP6Address *item = &g_array_index (priv->addresses, NMPlatformIP6Address, i);
|
||||||
|
|
||||||
if (IN6_ARE_ADDR_EQUAL (&item->address, &new->address)) {
|
if (IN6_ARE_ADDR_EQUAL (&item->address, &new->address)) {
|
||||||
|
if (nm_platform_ip6_address_cmp (item, new) == 0)
|
||||||
|
return;
|
||||||
/* Copy over old item to get new lifetime, timestamp, preferred */
|
/* Copy over old item to get new lifetime, timestamp, preferred */
|
||||||
memcpy (item, new, sizeof (*item));
|
*item = *new;
|
||||||
return;
|
goto NOTIFY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g_array_append_val (priv->addresses, *new);
|
g_array_append_val (priv->addresses, *new);
|
||||||
|
NOTIFY:
|
||||||
|
_NOTIFY (config, PROP_ADDRESSES);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -745,6 +782,7 @@ nm_ip6_config_del_address (NMIP6Config *config, guint i)
|
||||||
g_return_if_fail (i < priv->addresses->len);
|
g_return_if_fail (i < priv->addresses->len);
|
||||||
|
|
||||||
g_array_remove_index (priv->addresses, i);
|
g_array_remove_index (priv->addresses, i);
|
||||||
|
_NOTIFY (config, PROP_ADDRESSES);
|
||||||
}
|
}
|
||||||
|
|
||||||
guint
|
guint
|
||||||
|
@ -770,7 +808,10 @@ nm_ip6_config_reset_routes (NMIP6Config *config)
|
||||||
{
|
{
|
||||||
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
|
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
|
||||||
|
|
||||||
g_array_set_size (priv->routes, 0);
|
if (priv->routes->len != 0) {
|
||||||
|
g_array_set_size (priv->routes, 0);
|
||||||
|
_NOTIFY (config, PROP_ROUTES);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -785,12 +826,16 @@ nm_ip6_config_add_route (NMIP6Config *config, const NMPlatformIP6Route *new)
|
||||||
NMPlatformIP6Route *item = &g_array_index (priv->routes, NMPlatformIP6Route, i);
|
NMPlatformIP6Route *item = &g_array_index (priv->routes, NMPlatformIP6Route, i);
|
||||||
|
|
||||||
if (routes_are_duplicate (item, new, FALSE)) {
|
if (routes_are_duplicate (item, new, FALSE)) {
|
||||||
memcpy (item, new, sizeof (*item));
|
if (nm_platform_ip6_route_cmp (item, new) == 0)
|
||||||
return;
|
return;
|
||||||
|
*item = *new;
|
||||||
|
goto NOTIFY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g_array_append_val (priv->routes, *new);
|
g_array_append_val (priv->routes, *new);
|
||||||
|
NOTIFY:
|
||||||
|
_NOTIFY (config, PROP_ROUTES);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -801,6 +846,7 @@ nm_ip6_config_del_route (NMIP6Config *config, guint i)
|
||||||
g_return_if_fail (i < priv->routes->len);
|
g_return_if_fail (i < priv->routes->len);
|
||||||
|
|
||||||
g_array_remove_index (priv->routes, i);
|
g_array_remove_index (priv->routes, i);
|
||||||
|
_NOTIFY (config, PROP_ROUTES);
|
||||||
}
|
}
|
||||||
|
|
||||||
guint
|
guint
|
||||||
|
@ -826,7 +872,10 @@ nm_ip6_config_reset_nameservers (NMIP6Config *config)
|
||||||
{
|
{
|
||||||
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
|
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
|
||||||
|
|
||||||
g_array_set_size (priv->nameservers, 0);
|
if (priv->nameservers->len != 0) {
|
||||||
|
g_array_set_size (priv->nameservers, 0);
|
||||||
|
_NOTIFY (config, PROP_NAMESERVERS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -842,6 +891,7 @@ nm_ip6_config_add_nameserver (NMIP6Config *config, const struct in6_addr *new)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_array_append_val (priv->nameservers, *new);
|
g_array_append_val (priv->nameservers, *new);
|
||||||
|
_NOTIFY (config, PROP_NAMESERVERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -852,6 +902,7 @@ nm_ip6_config_del_nameserver (NMIP6Config *config, guint i)
|
||||||
g_return_if_fail (i < priv->nameservers->len);
|
g_return_if_fail (i < priv->nameservers->len);
|
||||||
|
|
||||||
g_array_remove_index (priv->nameservers, i);
|
g_array_remove_index (priv->nameservers, i);
|
||||||
|
_NOTIFY (config, PROP_NAMESERVERS);
|
||||||
}
|
}
|
||||||
|
|
||||||
guint32
|
guint32
|
||||||
|
@ -877,7 +928,10 @@ nm_ip6_config_reset_domains (NMIP6Config *config)
|
||||||
{
|
{
|
||||||
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
|
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
|
||||||
|
|
||||||
g_ptr_array_set_size (priv->domains, 0);
|
if (priv->domains->len != 0) {
|
||||||
|
g_ptr_array_set_size (priv->domains, 0);
|
||||||
|
_NOTIFY (config, PROP_DOMAINS);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -894,6 +948,7 @@ nm_ip6_config_add_domain (NMIP6Config *config, const char *domain)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_ptr_array_add (priv->domains, g_strdup (domain));
|
g_ptr_array_add (priv->domains, g_strdup (domain));
|
||||||
|
_NOTIFY (config, PROP_DOMAINS);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -904,6 +959,7 @@ nm_ip6_config_del_domain (NMIP6Config *config, guint i)
|
||||||
g_return_if_fail (i < priv->domains->len);
|
g_return_if_fail (i < priv->domains->len);
|
||||||
|
|
||||||
g_ptr_array_remove_index (priv->domains, i);
|
g_ptr_array_remove_index (priv->domains, i);
|
||||||
|
_NOTIFY (config, PROP_DOMAINS);
|
||||||
}
|
}
|
||||||
|
|
||||||
guint32
|
guint32
|
||||||
|
@ -929,7 +985,10 @@ nm_ip6_config_reset_searches (NMIP6Config *config)
|
||||||
{
|
{
|
||||||
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
|
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
|
||||||
|
|
||||||
g_ptr_array_set_size (priv->searches, 0);
|
if (priv->searches->len != 0) {
|
||||||
|
g_ptr_array_set_size (priv->searches, 0);
|
||||||
|
_NOTIFY (config, PROP_SEARCHES);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -946,6 +1005,7 @@ nm_ip6_config_add_search (NMIP6Config *config, const char *new)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
g_ptr_array_add (priv->searches, g_strdup (new));
|
g_ptr_array_add (priv->searches, g_strdup (new));
|
||||||
|
_NOTIFY (config, PROP_SEARCHES);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -956,6 +1016,7 @@ nm_ip6_config_del_search (NMIP6Config *config, guint i)
|
||||||
g_return_if_fail (i < priv->searches->len);
|
g_return_if_fail (i < priv->searches->len);
|
||||||
|
|
||||||
g_ptr_array_remove_index (priv->searches, i);
|
g_ptr_array_remove_index (priv->searches, i);
|
||||||
|
_NOTIFY (config, PROP_SEARCHES);
|
||||||
}
|
}
|
||||||
|
|
||||||
guint32
|
guint32
|
||||||
|
@ -1163,6 +1224,13 @@ get_property (GObject *object, guint prop_id,
|
||||||
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (object);
|
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (object);
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
|
case PROP_GATEWAY:
|
||||||
|
if (!IN6_IS_ADDR_UNSPECIFIED (&priv->gateway)) {
|
||||||
|
char addr_buf[INET6_ADDRSTRLEN];
|
||||||
|
g_value_set_string (value, inet_ntop (AF_INET6, &priv->gateway, addr_buf, sizeof (addr_buf)));
|
||||||
|
} else
|
||||||
|
g_value_set_string (value, NULL);
|
||||||
|
break;
|
||||||
case PROP_ADDRESSES:
|
case PROP_ADDRESSES:
|
||||||
{
|
{
|
||||||
GPtrArray *addresses = g_ptr_array_new ();
|
GPtrArray *addresses = g_ptr_array_new ();
|
||||||
|
@ -1254,6 +1322,9 @@ get_property (GObject *object, guint prop_id,
|
||||||
case PROP_DOMAINS:
|
case PROP_DOMAINS:
|
||||||
g_value_set_boxed (value, priv->domains);
|
g_value_set_boxed (value, priv->domains);
|
||||||
break;
|
break;
|
||||||
|
case PROP_SEARCHES:
|
||||||
|
g_value_set_boxed (value, priv->searches);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
@ -1272,33 +1343,44 @@ nm_ip6_config_class_init (NMIP6ConfigClass *config_class)
|
||||||
object_class->finalize = finalize;
|
object_class->finalize = finalize;
|
||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
g_object_class_install_property (object_class, PROP_ADDRESSES,
|
obj_properties[PROP_GATEWAY] =
|
||||||
|
g_param_spec_string (NM_IP6_CONFIG_GATEWAY,
|
||||||
|
"Gateway",
|
||||||
|
"IP6 Gateway",
|
||||||
|
NULL,
|
||||||
|
G_PARAM_READABLE);
|
||||||
|
obj_properties[PROP_ADDRESSES] =
|
||||||
g_param_spec_boxed (NM_IP6_CONFIG_ADDRESSES,
|
g_param_spec_boxed (NM_IP6_CONFIG_ADDRESSES,
|
||||||
"Addresses",
|
"Addresses",
|
||||||
"IP6 addresses",
|
"IP6 addresses",
|
||||||
DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS,
|
DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS,
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE);
|
||||||
|
obj_properties[PROP_ROUTES] =
|
||||||
g_object_class_install_property (object_class, PROP_NAMESERVERS,
|
|
||||||
g_param_spec_boxed (NM_IP6_CONFIG_NAMESERVERS,
|
|
||||||
"Nameservers",
|
|
||||||
"DNS list",
|
|
||||||
DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UCHAR,
|
|
||||||
G_PARAM_READABLE));
|
|
||||||
|
|
||||||
g_object_class_install_property (object_class, PROP_DOMAINS,
|
|
||||||
g_param_spec_boxed (NM_IP6_CONFIG_DOMAINS,
|
|
||||||
"Domains",
|
|
||||||
"Domains",
|
|
||||||
DBUS_TYPE_G_ARRAY_OF_STRING,
|
|
||||||
G_PARAM_READABLE));
|
|
||||||
|
|
||||||
g_object_class_install_property (object_class, PROP_ROUTES,
|
|
||||||
g_param_spec_boxed (NM_IP6_CONFIG_ROUTES,
|
g_param_spec_boxed (NM_IP6_CONFIG_ROUTES,
|
||||||
"Routes",
|
"Routes",
|
||||||
"Routes",
|
"Routes",
|
||||||
DBUS_TYPE_G_ARRAY_OF_IP6_ROUTE,
|
DBUS_TYPE_G_ARRAY_OF_IP6_ROUTE,
|
||||||
G_PARAM_READABLE));
|
G_PARAM_READABLE);
|
||||||
|
obj_properties[PROP_NAMESERVERS] =
|
||||||
|
g_param_spec_boxed (NM_IP6_CONFIG_NAMESERVERS,
|
||||||
|
"Nameservers",
|
||||||
|
"DNS list",
|
||||||
|
DBUS_TYPE_G_ARRAY_OF_ARRAY_OF_UCHAR,
|
||||||
|
G_PARAM_READABLE);
|
||||||
|
obj_properties[PROP_DOMAINS] =
|
||||||
|
g_param_spec_boxed (NM_IP6_CONFIG_DOMAINS,
|
||||||
|
"Domains",
|
||||||
|
"Domains",
|
||||||
|
DBUS_TYPE_G_ARRAY_OF_STRING,
|
||||||
|
G_PARAM_READABLE);
|
||||||
|
obj_properties[PROP_SEARCHES] =
|
||||||
|
g_param_spec_boxed (NM_IP6_CONFIG_SEARCHES,
|
||||||
|
"Searches",
|
||||||
|
"Searches",
|
||||||
|
DBUS_TYPE_G_ARRAY_OF_STRING,
|
||||||
|
G_PARAM_READABLE);
|
||||||
|
|
||||||
|
g_object_class_install_properties (object_class, LAST_PROP, obj_properties);
|
||||||
|
|
||||||
dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (config_class),
|
dbus_g_object_type_install_info (G_TYPE_FROM_CLASS (config_class),
|
||||||
&dbus_glib_nm_ip6_config_object_info);
|
&dbus_glib_nm_ip6_config_object_info);
|
||||||
|
|
|
@ -41,10 +41,12 @@ typedef struct {
|
||||||
GObjectClass parent;
|
GObjectClass parent;
|
||||||
} NMIP6ConfigClass;
|
} NMIP6ConfigClass;
|
||||||
|
|
||||||
|
#define NM_IP6_CONFIG_GATEWAY "gateway"
|
||||||
#define NM_IP6_CONFIG_ADDRESSES "addresses"
|
#define NM_IP6_CONFIG_ADDRESSES "addresses"
|
||||||
|
#define NM_IP6_CONFIG_ROUTES "routes"
|
||||||
#define NM_IP6_CONFIG_NAMESERVERS "nameservers"
|
#define NM_IP6_CONFIG_NAMESERVERS "nameservers"
|
||||||
#define NM_IP6_CONFIG_DOMAINS "domains"
|
#define NM_IP6_CONFIG_DOMAINS "domains"
|
||||||
#define NM_IP6_CONFIG_ROUTES "routes"
|
#define NM_IP6_CONFIG_SEARCHES "searches"
|
||||||
|
|
||||||
GType nm_ip6_config_get_type (void);
|
GType nm_ip6_config_get_type (void);
|
||||||
|
|
||||||
|
|
|
@ -1524,19 +1524,23 @@ device_ip4_config_changed (NMDevice *device,
|
||||||
|
|
||||||
nm_dns_manager_begin_updates (priv->dns_manager, __func__);
|
nm_dns_manager_begin_updates (priv->dns_manager, __func__);
|
||||||
|
|
||||||
/* Old configs get removed immediately */
|
|
||||||
if (old_config)
|
|
||||||
nm_dns_manager_remove_ip4_config (priv->dns_manager, old_config);
|
|
||||||
|
|
||||||
/* Ignore IP config changes while the device is activating, because we'll
|
/* Ignore IP config changes while the device is activating, because we'll
|
||||||
* catch all the changes when the device moves to ACTIVATED state.
|
* catch all the changes when the device moves to ACTIVATED state.
|
||||||
* Prevents unecessary changes to DNS information.
|
* Prevents unecessary changes to DNS information.
|
||||||
*/
|
*/
|
||||||
if (!nm_device_is_activating (device)) {
|
if (!nm_device_is_activating (device)) {
|
||||||
if (new_config)
|
if (old_config != new_config) {
|
||||||
nm_dns_manager_add_ip4_config (priv->dns_manager, ip_iface, new_config, NM_DNS_IP_CONFIG_TYPE_DEFAULT);
|
if (old_config)
|
||||||
|
nm_dns_manager_remove_ip4_config (priv->dns_manager, old_config);
|
||||||
|
if (new_config)
|
||||||
|
nm_dns_manager_add_ip4_config (priv->dns_manager, ip_iface, new_config, NM_DNS_IP_CONFIG_TYPE_DEFAULT);
|
||||||
|
}
|
||||||
update_ip4_dns (policy, priv->dns_manager);
|
update_ip4_dns (policy, priv->dns_manager);
|
||||||
update_ip4_routing (policy, TRUE);
|
update_ip4_routing (policy, TRUE);
|
||||||
|
} else {
|
||||||
|
/* Old configs get removed immediately */
|
||||||
|
if (old_config)
|
||||||
|
nm_dns_manager_remove_ip4_config (priv->dns_manager, old_config);
|
||||||
}
|
}
|
||||||
|
|
||||||
nm_dns_manager_end_updates (priv->dns_manager, __func__);
|
nm_dns_manager_end_updates (priv->dns_manager, __func__);
|
||||||
|
@ -1554,19 +1558,23 @@ device_ip6_config_changed (NMDevice *device,
|
||||||
|
|
||||||
nm_dns_manager_begin_updates (priv->dns_manager, __func__);
|
nm_dns_manager_begin_updates (priv->dns_manager, __func__);
|
||||||
|
|
||||||
/* Old configs get removed immediately */
|
|
||||||
if (old_config)
|
|
||||||
nm_dns_manager_remove_ip6_config (priv->dns_manager, old_config);
|
|
||||||
|
|
||||||
/* Ignore IP config changes while the device is activating, because we'll
|
/* Ignore IP config changes while the device is activating, because we'll
|
||||||
* catch all the changes when the device moves to ACTIVATED state.
|
* catch all the changes when the device moves to ACTIVATED state.
|
||||||
* Prevents unecessary changes to DNS information.
|
* Prevents unecessary changes to DNS information.
|
||||||
*/
|
*/
|
||||||
if (!nm_device_is_activating (device)) {
|
if (!nm_device_is_activating (device)) {
|
||||||
if (new_config)
|
if (old_config != new_config) {
|
||||||
nm_dns_manager_add_ip6_config (priv->dns_manager, ip_iface, new_config, NM_DNS_IP_CONFIG_TYPE_DEFAULT);
|
if (old_config)
|
||||||
|
nm_dns_manager_remove_ip6_config (priv->dns_manager, old_config);
|
||||||
|
if (new_config)
|
||||||
|
nm_dns_manager_add_ip6_config (priv->dns_manager, ip_iface, new_config, NM_DNS_IP_CONFIG_TYPE_DEFAULT);
|
||||||
|
}
|
||||||
update_ip6_dns (policy, priv->dns_manager);
|
update_ip6_dns (policy, priv->dns_manager);
|
||||||
update_ip6_routing (policy, TRUE);
|
update_ip6_routing (policy, TRUE);
|
||||||
|
} else {
|
||||||
|
/* Old configs get removed immediately */
|
||||||
|
if (old_config)
|
||||||
|
nm_dns_manager_remove_ip6_config (priv->dns_manager, old_config);
|
||||||
}
|
}
|
||||||
|
|
||||||
nm_dns_manager_end_updates (priv->dns_manager, __func__);
|
nm_dns_manager_end_updates (priv->dns_manager, __func__);
|
||||||
|
|
Loading…
Reference in a new issue