mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2025-12-25 22:20:08 +01:00
core: merge branch 'th/activation-state-flags-rh1454883'
https://bugzilla.redhat.com/show_bug.cgi?id=1454883
This commit is contained in:
commit
2a63bbfb78
12 changed files with 394 additions and 152 deletions
|
|
@ -80,6 +80,15 @@
|
|||
-->
|
||||
<property name="State" type="u" access="read"/>
|
||||
|
||||
<!--
|
||||
StateFlags:
|
||||
|
||||
The state flags of this active connection.
|
||||
|
||||
Returns: <link linkend="NMActivationStateFlags">NMActivationStateFlags</link>
|
||||
-->
|
||||
<property name="StateFlags" type="u" access="read"/>
|
||||
|
||||
<!--
|
||||
StateChanged:
|
||||
@state: (<link linkend="NMActiveConnectionState">NMActiveConnectionState</link>) The new state of the active connection.
|
||||
|
|
|
|||
|
|
@ -877,4 +877,30 @@ typedef enum {
|
|||
NM_IP_ROUTE_TABLE_SYNC_MODE_FULL = 3,
|
||||
} NMIPRouteTableSyncMode;
|
||||
|
||||
/**
|
||||
* NMActivationStateFlags:
|
||||
* @NM_ACTIVATION_STATE_FLAG_NONE: an alias for numeric zero, no flags set.
|
||||
* @NM_ACTIVATION_STATE_FLAG_IS_MASTER: the device is a master.
|
||||
* @NM_ACTIVATION_STATE_FLAG_IS_SLAVE: the device is a slave.
|
||||
* @NM_ACTIVATION_STATE_FLAG_LAYER2_READY: layer2 is activated and ready.
|
||||
* @NM_ACTIVATION_STATE_FLAG_IP4_READY: IPv4 setting is completed.
|
||||
* @NM_ACTIVATION_STATE_FLAG_IP6_READY: IPv6 setting is completed.
|
||||
* @NM_ACTIVATION_STATE_FLAG_MASTER_HAS_SLAVES: The master has any slave devices attached.
|
||||
* This only makes sense if the device is a master.
|
||||
*
|
||||
* Flags describing the current activation state.
|
||||
*
|
||||
* Since: 1.10
|
||||
**/
|
||||
typedef enum { /*< flags >*/
|
||||
NM_ACTIVATION_STATE_FLAG_NONE = 0,
|
||||
|
||||
NM_ACTIVATION_STATE_FLAG_IS_MASTER = (1LL << 0),
|
||||
NM_ACTIVATION_STATE_FLAG_IS_SLAVE = (1LL << 1),
|
||||
NM_ACTIVATION_STATE_FLAG_LAYER2_READY = (1LL << 2),
|
||||
NM_ACTIVATION_STATE_FLAG_IP4_READY = (1LL << 3),
|
||||
NM_ACTIVATION_STATE_FLAG_IP6_READY = (1LL << 4),
|
||||
NM_ACTIVATION_STATE_FLAG_MASTER_HAS_SLAVES = (1LL << 5),
|
||||
} NMActivationStateFlags;
|
||||
|
||||
#endif /* __NM_DBUS_INTERFACE_H__ */
|
||||
|
|
|
|||
|
|
@ -1180,6 +1180,8 @@ global:
|
|||
|
||||
libnm_1_10_0 {
|
||||
global:
|
||||
nm_activation_state_flags_get_type;
|
||||
nm_active_connection_get_state_flags;
|
||||
nm_client_connectivity_check_get_available;
|
||||
nm_client_connectivity_check_get_enabled;
|
||||
nm_client_connectivity_check_set_enabled;
|
||||
|
|
|
|||
|
|
@ -51,6 +51,7 @@ typedef struct {
|
|||
char *specific_object_path;
|
||||
GPtrArray *devices;
|
||||
NMActiveConnectionState state;
|
||||
guint state_flags;
|
||||
gboolean is_default;
|
||||
NMIPConfig *ip4_config;
|
||||
NMDhcpConfig *dhcp4_config;
|
||||
|
|
@ -71,6 +72,7 @@ enum {
|
|||
PROP_SPECIFIC_OBJECT_PATH,
|
||||
PROP_DEVICES,
|
||||
PROP_STATE,
|
||||
PROP_STATE_FLAGS,
|
||||
PROP_DEFAULT,
|
||||
PROP_IP4_CONFIG,
|
||||
PROP_DHCP4_CONFIG,
|
||||
|
|
@ -215,6 +217,24 @@ nm_active_connection_get_state (NMActiveConnection *connection)
|
|||
return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->state;
|
||||
}
|
||||
|
||||
/**
|
||||
* nm_active_connection_get_state_flags:
|
||||
* @connection: a #NMActiveConnection
|
||||
*
|
||||
* Gets the active connection's state flags.
|
||||
*
|
||||
* Returns: the state flags
|
||||
*
|
||||
* Since: 1.10
|
||||
**/
|
||||
NMActivationStateFlags
|
||||
nm_active_connection_get_state_flags (NMActiveConnection *connection)
|
||||
{
|
||||
g_return_val_if_fail (NM_IS_ACTIVE_CONNECTION (connection), NM_ACTIVATION_STATE_FLAG_NONE);
|
||||
|
||||
return NM_ACTIVE_CONNECTION_GET_PRIVATE (connection)->state_flags;
|
||||
}
|
||||
|
||||
/**
|
||||
* nm_active_connection_get_state_reason:
|
||||
* @connection: a #NMActiveConnection
|
||||
|
|
@ -474,6 +494,9 @@ get_property (GObject *object,
|
|||
case PROP_STATE:
|
||||
g_value_set_enum (value, nm_active_connection_get_state (self));
|
||||
break;
|
||||
case PROP_STATE_FLAGS:
|
||||
g_value_set_uint (value, nm_active_connection_get_state_flags (self));
|
||||
break;
|
||||
case PROP_DEFAULT:
|
||||
g_value_set_boolean (value, nm_active_connection_get_default (self));
|
||||
break;
|
||||
|
|
@ -537,6 +560,7 @@ init_dbus (NMObject *object)
|
|||
{ "specific-object", &priv->specific_object_path, demarshal_specific_object_path },
|
||||
{ NM_ACTIVE_CONNECTION_DEVICES, &priv->devices, NULL, NM_TYPE_DEVICE },
|
||||
{ NM_ACTIVE_CONNECTION_STATE, &priv->state },
|
||||
{ NM_ACTIVE_CONNECTION_STATE_FLAGS, &priv->state_flags },
|
||||
{ NM_ACTIVE_CONNECTION_DEFAULT, &priv->is_default },
|
||||
{ NM_ACTIVE_CONNECTION_IP4_CONFIG, &priv->ip4_config, NULL, NM_TYPE_IP4_CONFIG },
|
||||
{ NM_ACTIVE_CONNECTION_DHCP4_CONFIG, &priv->dhcp4_config, NULL, NM_TYPE_DHCP4_CONFIG },
|
||||
|
|
@ -663,6 +687,21 @@ nm_active_connection_class_init (NMActiveConnectionClass *ap_class)
|
|||
G_PARAM_READABLE |
|
||||
G_PARAM_STATIC_STRINGS));
|
||||
|
||||
/**
|
||||
* NMActiveConnection:state-flags:
|
||||
*
|
||||
* The state flags of the active connection.
|
||||
*
|
||||
* Since: 1.10
|
||||
**/
|
||||
g_object_class_install_property
|
||||
(object_class, PROP_STATE_FLAGS,
|
||||
g_param_spec_uint (NM_ACTIVE_CONNECTION_STATE_FLAGS, "", "",
|
||||
0, G_MAXUINT32,
|
||||
NM_ACTIVATION_STATE_FLAG_NONE,
|
||||
G_PARAM_READABLE |
|
||||
G_PARAM_STATIC_STRINGS));
|
||||
|
||||
/**
|
||||
* NMActiveConnection:default:
|
||||
*
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@ G_BEGIN_DECLS
|
|||
#define NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT_PATH "specific-object-path"
|
||||
#define NM_ACTIVE_CONNECTION_DEVICES "devices"
|
||||
#define NM_ACTIVE_CONNECTION_STATE "state"
|
||||
#define NM_ACTIVE_CONNECTION_STATE_FLAGS "state-flags"
|
||||
#define NM_ACTIVE_CONNECTION_DEFAULT "default"
|
||||
#define NM_ACTIVE_CONNECTION_IP4_CONFIG "ip4-config"
|
||||
#define NM_ACTIVE_CONNECTION_DHCP4_CONFIG "dhcp4-config"
|
||||
|
|
@ -76,6 +77,8 @@ const char *nm_active_connection_get_connection_type (NM
|
|||
const char *nm_active_connection_get_specific_object_path (NMActiveConnection *connection);
|
||||
const GPtrArray *nm_active_connection_get_devices (NMActiveConnection *connection);
|
||||
NMActiveConnectionState nm_active_connection_get_state (NMActiveConnection *connection);
|
||||
NM_AVAILABLE_IN_1_10
|
||||
NMActivationStateFlags nm_active_connection_get_state_flags (NMActiveConnection *connection);
|
||||
NM_AVAILABLE_IN_1_8
|
||||
NMActiveConnectionStateReason nm_active_connection_get_state_reason (NMActiveConnection *connection);
|
||||
NMDevice *nm_active_connection_get_master (NMActiveConnection *connection);
|
||||
|
|
|
|||
|
|
@ -115,6 +115,89 @@ nm_utils_strbuf_append (char **buf, gsize *len, const char *format, ...)
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
char _nm_utils_to_string_buffer[];
|
||||
|
||||
void
|
||||
nm_utils_to_string_buffer_init (char **buf, gsize *len)
|
||||
{
|
||||
if (!*buf) {
|
||||
*buf = _nm_utils_to_string_buffer;
|
||||
*len = sizeof (_nm_utils_to_string_buffer);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
nm_utils_to_string_buffer_init_null (gconstpointer obj, char **buf, gsize *len)
|
||||
{
|
||||
nm_utils_to_string_buffer_init (buf, len);
|
||||
if (!obj) {
|
||||
g_strlcpy (*buf, "(null)", *len);
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
const char *
|
||||
nm_utils_flags2str (const NMUtilsFlags2StrDesc *descs,
|
||||
gsize n_descs,
|
||||
unsigned flags,
|
||||
char *buf,
|
||||
gsize len)
|
||||
{
|
||||
gsize i;
|
||||
char *p;
|
||||
|
||||
#if NM_MORE_ASSERTS > 10
|
||||
nm_assert (descs);
|
||||
nm_assert (n_descs > 0);
|
||||
for (i = 0; i < n_descs; i++) {
|
||||
gsize j;
|
||||
|
||||
nm_assert (descs[i].name && descs[i].name[0]);
|
||||
for (j = 0; j < i; j++)
|
||||
nm_assert (descs[j].flag != descs[i].flag);
|
||||
}
|
||||
#endif
|
||||
|
||||
nm_utils_to_string_buffer_init (&buf, &len);
|
||||
|
||||
if (!len)
|
||||
return buf;
|
||||
|
||||
buf[0] = '\0';
|
||||
p = buf;
|
||||
if (!flags) {
|
||||
for (i = 0; i < n_descs; i++) {
|
||||
if (!descs[i].flag) {
|
||||
nm_utils_strbuf_append_str (&p, &len, descs[i].name);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
for (i = 0; flags && i < n_descs; i++) {
|
||||
if ( descs[i].flag
|
||||
&& NM_FLAGS_ALL (flags, descs[i].flag)) {
|
||||
flags &= ~descs[i].flag;
|
||||
|
||||
if (buf[0] != '\0')
|
||||
nm_utils_strbuf_append_c (&p, &len, ',');
|
||||
nm_utils_strbuf_append_str (&p, &len, descs[i].name);
|
||||
}
|
||||
}
|
||||
if (flags) {
|
||||
if (buf[0] != '\0')
|
||||
nm_utils_strbuf_append_c (&p, &len, ',');
|
||||
nm_utils_strbuf_append (&p, &len, "0x%x", flags);
|
||||
}
|
||||
return buf;
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
/**
|
||||
* _nm_utils_ip4_prefix_to_netmask:
|
||||
* @prefix: a CIDR prefix
|
||||
|
|
|
|||
|
|
@ -212,6 +212,74 @@ gint _nm_utils_ascii_str_to_bool (const char *str,
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
extern char _nm_utils_to_string_buffer[2096];
|
||||
|
||||
void nm_utils_to_string_buffer_init (char **buf, gsize *len);
|
||||
gboolean nm_utils_to_string_buffer_init_null (gconstpointer obj, char **buf, gsize *len);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
typedef struct {
|
||||
unsigned flag;
|
||||
const char *name;
|
||||
} NMUtilsFlags2StrDesc;
|
||||
|
||||
#define NM_UTILS_FLAGS2STR(f, n) { .flag = f, .name = ""n, }
|
||||
|
||||
#define _NM_UTILS_FLAGS2STR_DEFINE(scope, fcn_name, flags_type, ...) \
|
||||
scope const char * \
|
||||
fcn_name (flags_type flags, char *buf, gsize len) \
|
||||
{ \
|
||||
static const NMUtilsFlags2StrDesc descs[] = { \
|
||||
__VA_ARGS__ \
|
||||
}; \
|
||||
G_STATIC_ASSERT (sizeof (flags_type) <= sizeof (unsigned)); \
|
||||
return nm_utils_flags2str (descs, G_N_ELEMENTS (descs), flags, buf, len); \
|
||||
};
|
||||
|
||||
#define NM_UTILS_FLAGS2STR_DEFINE(fcn_name, flags_type, ...) \
|
||||
_NM_UTILS_FLAGS2STR_DEFINE (, fcn_name, flags_type, __VA_ARGS__)
|
||||
#define NM_UTILS_FLAGS2STR_DEFINE_STATIC(fcn_name, flags_type, ...) \
|
||||
_NM_UTILS_FLAGS2STR_DEFINE (static, fcn_name, flags_type, __VA_ARGS__)
|
||||
|
||||
const char *nm_utils_flags2str (const NMUtilsFlags2StrDesc *descs,
|
||||
gsize n_descs,
|
||||
unsigned flags,
|
||||
char *buf,
|
||||
gsize len);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#define NM_UTILS_ENUM2STR(v, n) (void) 0; case v: s = ""n""; break; (void) 0
|
||||
#define NM_UTILS_ENUM2STR_IGNORE(v) (void) 0; case v: break; (void) 0
|
||||
|
||||
#define _NM_UTILS_ENUM2STR_DEFINE(scope, fcn_name, lookup_type, int_fmt, ...) \
|
||||
scope const char * \
|
||||
fcn_name (lookup_type val, char *buf, gsize len) \
|
||||
{ \
|
||||
nm_utils_to_string_buffer_init (&buf, &len); \
|
||||
if (len) { \
|
||||
const char *s = NULL; \
|
||||
switch (val) { \
|
||||
(void) 0, \
|
||||
__VA_ARGS__ \
|
||||
(void) 0; \
|
||||
}; \
|
||||
if (s) \
|
||||
g_strlcpy (buf, s, len); \
|
||||
else \
|
||||
g_snprintf (buf, len, "(%"int_fmt")", val); \
|
||||
} \
|
||||
return buf; \
|
||||
}
|
||||
|
||||
#define NM_UTILS_ENUM2STR_DEFINE(fcn_name, lookup_type, ...) \
|
||||
_NM_UTILS_ENUM2STR_DEFINE (, fcn_name, lookup_type, "d", __VA_ARGS__)
|
||||
#define NM_UTILS_ENUM2STR_DEFINE_STATIC(fcn_name, lookup_type, ...) \
|
||||
_NM_UTILS_ENUM2STR_DEFINE (static, fcn_name, lookup_type, "d", __VA_ARGS__)
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#define _nm_g_slice_free_fcn_define(mem_size) \
|
||||
static inline void \
|
||||
_nm_g_slice_free_fcn_##mem_size (gpointer mem_block) \
|
||||
|
|
|
|||
|
|
@ -746,6 +746,25 @@ nm_device_sys_iface_state_set (NMDevice *self,
|
|||
nm_assert (priv->sys_iface_state == sys_iface_state);
|
||||
}
|
||||
|
||||
static void
|
||||
_active_connection_set_state_flags_full (NMDevice *self,
|
||||
NMActivationStateFlags flags,
|
||||
NMActivationStateFlags mask)
|
||||
{
|
||||
NMActiveConnection *ac;
|
||||
|
||||
ac = NM_ACTIVE_CONNECTION (nm_device_get_act_request (self));
|
||||
if (ac)
|
||||
nm_active_connection_set_state_flags_full (ac, flags, mask);
|
||||
}
|
||||
|
||||
static void
|
||||
_active_connection_set_state_flags (NMDevice *self,
|
||||
NMActivationStateFlags flags)
|
||||
{
|
||||
_active_connection_set_state_flags_full (self, flags, flags);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
void
|
||||
|
|
@ -993,6 +1012,17 @@ _set_ip_state (NMDevice *self, int addr_family, IpState new_state)
|
|||
(int) new_state,
|
||||
_ip_state_to_string (new_state));
|
||||
*p = new_state;
|
||||
|
||||
if (new_state == IP_DONE) {
|
||||
/* we only set the IPx_READY flag once we reach IP_DONE state. We don't
|
||||
* ever clear it, even if we later enter IP_FAIL state.
|
||||
*
|
||||
* This is not documented/guaranteed behavior, but seems to make sense for now. */
|
||||
_active_connection_set_state_flags (self,
|
||||
addr_family == AF_INET
|
||||
? NM_ACTIVATION_STATE_FLAG_IP4_READY
|
||||
: NM_ACTIVATION_STATE_FLAG_IP6_READY);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -2185,6 +2215,12 @@ nm_device_master_release_one_slave (NMDevice *self, NMDevice *slave, gboolean co
|
|||
g_object_unref (slave);
|
||||
g_slice_free (SlaveInfo, info);
|
||||
|
||||
if (c_list_is_empty (&priv->slaves)) {
|
||||
_active_connection_set_state_flags_full (self,
|
||||
0,
|
||||
NM_ACTIVATION_STATE_FLAG_MASTER_HAS_SLAVES);
|
||||
}
|
||||
|
||||
/* Ensure the device's hardware address is up-to-date; it often changes
|
||||
* when slaves change.
|
||||
*/
|
||||
|
|
@ -3694,6 +3730,9 @@ nm_device_master_add_slave (NMDevice *self, NMDevice *slave, gboolean configure)
|
|||
c_list_link_tail (&priv->slaves, &info->lst_slave);
|
||||
slave_priv->master = g_object_ref (self);
|
||||
|
||||
_active_connection_set_state_flags (self,
|
||||
NM_ACTIVATION_STATE_FLAG_MASTER_HAS_SLAVES);
|
||||
|
||||
/* no need to emit
|
||||
*
|
||||
* _notify (slave, PROP_MASTER);
|
||||
|
|
@ -8085,6 +8124,9 @@ activate_stage3_ip_config_start (NMDevice *self)
|
|||
_set_ip_state (self, AF_INET, IP_WAIT);
|
||||
_set_ip_state (self, AF_INET6, IP_WAIT);
|
||||
|
||||
_active_connection_set_state_flags (self,
|
||||
NM_ACTIVATION_STATE_FLAG_LAYER2_READY);
|
||||
|
||||
nm_device_state_changed (self, NM_DEVICE_STATE_IP_CONFIG, NM_DEVICE_STATE_REASON_NONE);
|
||||
|
||||
/* Device should be up before we can do anything with it */
|
||||
|
|
|
|||
|
|
@ -44,6 +44,8 @@ typedef struct _NMActiveConnectionPrivate {
|
|||
|
||||
char *pending_activation_id;
|
||||
|
||||
NMActivationStateFlags state_flags;
|
||||
|
||||
NMActiveConnectionState state;
|
||||
bool is_default:1;
|
||||
bool is_default6:1;
|
||||
|
|
@ -73,6 +75,7 @@ NM_GOBJECT_PROPERTIES_DEFINE (NMActiveConnection,
|
|||
PROP_SPECIFIC_OBJECT,
|
||||
PROP_DEVICES,
|
||||
PROP_STATE,
|
||||
PROP_STATE_FLAGS,
|
||||
PROP_DEFAULT,
|
||||
PROP_IP4_CONFIG,
|
||||
PROP_DHCP4_CONFIG,
|
||||
|
|
@ -120,12 +123,11 @@ static void _set_activation_type_managed (NMActiveConnection *self);
|
|||
#define _NMLOG(level, ...) \
|
||||
G_STMT_START { \
|
||||
char _sbuf[64]; \
|
||||
NMDevice *_device = (self) ? NM_ACTIVE_CONNECTION_GET_PRIVATE (self)->device : NULL; \
|
||||
NMConnection *_applied_connection = _device ? NM_ACTIVE_CONNECTION_GET_PRIVATE (self)->applied_connection : NULL; \
|
||||
NMActiveConnectionPrivate *_priv = self ? NM_ACTIVE_CONNECTION_GET_PRIVATE (self) : NULL; \
|
||||
\
|
||||
nm_log ((level), _NMLOG_DOMAIN, \
|
||||
(_device) ? nm_device_get_iface (_device) : NULL, \
|
||||
(_applied_connection) ? nm_connection_get_uuid (_applied_connection) : NULL, \
|
||||
(_priv && _priv->device) ? nm_device_get_iface (_priv->device) : NULL, \
|
||||
(_priv && _priv->applied_connection) ? nm_connection_get_uuid (_priv->applied_connection) : NULL, \
|
||||
"%s%s: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__), \
|
||||
_NMLOG_PREFIX_NAME, \
|
||||
self ? nm_sprintf_buf (_sbuf, "[%p]", self) : "" \
|
||||
|
|
@ -144,6 +146,16 @@ NM_UTILS_LOOKUP_STR_DEFINE_STATIC (_state_to_string, NMActiveConnectionState,
|
|||
);
|
||||
#define state_to_string(state) NM_UTILS_LOOKUP_STR (_state_to_string, state)
|
||||
|
||||
NM_UTILS_FLAGS2STR_DEFINE_STATIC (_state_flags_to_string, NMActivationStateFlags,
|
||||
NM_UTILS_FLAGS2STR (NM_ACTIVATION_STATE_FLAG_NONE, "none"),
|
||||
NM_UTILS_FLAGS2STR (NM_ACTIVATION_STATE_FLAG_IS_MASTER, "is-master"),
|
||||
NM_UTILS_FLAGS2STR (NM_ACTIVATION_STATE_FLAG_IS_SLAVE, "is-slave"),
|
||||
NM_UTILS_FLAGS2STR (NM_ACTIVATION_STATE_FLAG_LAYER2_READY, "layer2-ready"),
|
||||
NM_UTILS_FLAGS2STR (NM_ACTIVATION_STATE_FLAG_IP4_READY, "ip4-ready"),
|
||||
NM_UTILS_FLAGS2STR (NM_ACTIVATION_STATE_FLAG_IP6_READY, "ip6-ready"),
|
||||
NM_UTILS_FLAGS2STR (NM_ACTIVATION_STATE_FLAG_MASTER_HAS_SLAVES, "master-has-slaves"),
|
||||
);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static void
|
||||
|
|
@ -280,6 +292,33 @@ nm_active_connection_set_state (NMActiveConnection *self,
|
|||
}
|
||||
}
|
||||
|
||||
NMActivationStateFlags
|
||||
nm_active_connection_get_state_flags (NMActiveConnection *self)
|
||||
{
|
||||
return NM_ACTIVE_CONNECTION_GET_PRIVATE (self)->state_flags;
|
||||
}
|
||||
|
||||
void
|
||||
nm_active_connection_set_state_flags_full (NMActiveConnection *self,
|
||||
NMActivationStateFlags state_flags,
|
||||
NMActivationStateFlags mask)
|
||||
{
|
||||
NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (self);
|
||||
NMActivationStateFlags f;
|
||||
|
||||
f = (priv->state_flags & ~mask) | (state_flags & mask);
|
||||
if (f != priv->state_flags) {
|
||||
char buf1[G_N_ELEMENTS (_nm_utils_to_string_buffer)];
|
||||
char buf2[G_N_ELEMENTS (_nm_utils_to_string_buffer)];
|
||||
|
||||
_LOGD ("set state-flags %s (was %s)",
|
||||
_state_flags_to_string (f, buf1, sizeof (buf1)),
|
||||
_state_flags_to_string (priv->state_flags, buf2, sizeof (buf2)));
|
||||
priv->state_flags = f;
|
||||
_notify (self, PROP_STATE_FLAGS);
|
||||
}
|
||||
}
|
||||
|
||||
const char *
|
||||
nm_active_connection_get_settings_connection_id (NMActiveConnection *self)
|
||||
{
|
||||
|
|
@ -331,6 +370,39 @@ nm_active_connection_get_applied_connection (NMActiveConnection *self)
|
|||
return con;
|
||||
}
|
||||
|
||||
static void
|
||||
_set_applied_connection_take (NMActiveConnection *self,
|
||||
NMConnection *applied_connection)
|
||||
{
|
||||
NMActiveConnectionPrivate *priv = NM_ACTIVE_CONNECTION_GET_PRIVATE (self);
|
||||
NMSettingConnection *s_con;
|
||||
NMActivationStateFlags flags_val = 0;
|
||||
|
||||
nm_assert (NM_IS_CONNECTION (applied_connection));
|
||||
nm_assert (!priv->applied_connection);
|
||||
|
||||
/* we take ownership of @applied_connection. Ensure to pass in a reference. */
|
||||
priv->applied_connection = applied_connection;
|
||||
nm_connection_clear_secrets (priv->applied_connection);
|
||||
|
||||
/* we determine whether the connection is a master/slave, based solely
|
||||
* on the connection properties itself. */
|
||||
s_con = nm_connection_get_setting_connection (priv->applied_connection);
|
||||
if (nm_setting_connection_get_master (s_con))
|
||||
flags_val |= NM_ACTIVATION_STATE_FLAG_IS_SLAVE;
|
||||
|
||||
if (NM_IN_STRSET (nm_setting_connection_get_connection_type (s_con),
|
||||
NM_SETTING_BOND_SETTING_NAME,
|
||||
NM_SETTING_BRIDGE_SETTING_NAME,
|
||||
NM_SETTING_TEAM_SETTING_NAME))
|
||||
flags_val |= NM_ACTIVATION_STATE_FLAG_IS_MASTER;
|
||||
|
||||
nm_active_connection_set_state_flags_full (self,
|
||||
flags_val,
|
||||
NM_ACTIVATION_STATE_FLAG_IS_MASTER
|
||||
| NM_ACTIVATION_STATE_FLAG_IS_SLAVE);
|
||||
}
|
||||
|
||||
void
|
||||
nm_active_connection_set_settings_connection (NMActiveConnection *self,
|
||||
NMSettingsConnection *connection)
|
||||
|
|
@ -355,8 +427,9 @@ nm_active_connection_set_settings_connection (NMActiveConnection *self,
|
|||
g_return_if_fail (!nm_exported_object_is_exported (NM_EXPORTED_OBJECT (self)));
|
||||
|
||||
_set_settings_connection (self, connection);
|
||||
priv->applied_connection = nm_simple_connection_new_clone (NM_CONNECTION (priv->settings_connection));
|
||||
nm_connection_clear_secrets (priv->applied_connection);
|
||||
|
||||
_set_applied_connection_take (self,
|
||||
nm_simple_connection_new_clone (NM_CONNECTION (priv->settings_connection)));
|
||||
}
|
||||
|
||||
gboolean
|
||||
|
|
@ -1091,6 +1164,9 @@ get_property (GObject *object, guint prop_id,
|
|||
g_value_set_uint (value, NM_ACTIVE_CONNECTION_STATE_ACTIVATING);
|
||||
}
|
||||
break;
|
||||
case PROP_STATE_FLAGS:
|
||||
g_value_set_uint (value, priv->state_flags);
|
||||
break;
|
||||
case PROP_DEFAULT:
|
||||
g_value_set_boolean (value, priv->is_default);
|
||||
break;
|
||||
|
|
@ -1151,8 +1227,15 @@ set_property (GObject *object, guint prop_id,
|
|||
case PROP_INT_APPLIED_CONNECTION:
|
||||
/* construct-only */
|
||||
acon = g_value_get_object (value);
|
||||
if (acon)
|
||||
if (acon) {
|
||||
/* we don't call _set_applied_connection_take() yet, because the instance
|
||||
* is not yet fully initialized. We are currently in the process of setting
|
||||
* the constructor properties.
|
||||
*
|
||||
* For now, just piggyback the connection, but call _set_applied_connection_take()
|
||||
* in constructed(). */
|
||||
priv->applied_connection = g_object_ref (acon);
|
||||
}
|
||||
break;
|
||||
case PROP_INT_DEVICE:
|
||||
/* construct-only */
|
||||
|
|
@ -1220,17 +1303,25 @@ constructed (GObject *object)
|
|||
|
||||
G_OBJECT_CLASS (nm_active_connection_parent_class)->constructed (object);
|
||||
|
||||
if (!priv->applied_connection && priv->settings_connection)
|
||||
if ( !priv->applied_connection
|
||||
&& priv->settings_connection)
|
||||
priv->applied_connection = nm_simple_connection_new_clone (NM_CONNECTION (priv->settings_connection));
|
||||
|
||||
if (priv->applied_connection)
|
||||
nm_connection_clear_secrets (priv->applied_connection);
|
||||
|
||||
_LOGD ("constructed (%s, version-id %llu, type %s)",
|
||||
G_OBJECT_TYPE_NAME (self),
|
||||
(unsigned long long) priv->version_id,
|
||||
nm_activation_type_to_string (priv->activation_type));
|
||||
|
||||
if (priv->applied_connection) {
|
||||
/* priv->applied_connection was set during the construction of the object.
|
||||
* It's not yet fully initialized, so do that now.
|
||||
*
|
||||
* We delayed that, because we may log in _set_applied_connection_take(), and the
|
||||
* first logging line should be "constructed" above). */
|
||||
_set_applied_connection_take (self,
|
||||
g_steal_pointer (&priv->applied_connection));
|
||||
}
|
||||
|
||||
g_return_if_fail (priv->subject);
|
||||
}
|
||||
|
||||
|
|
@ -1330,6 +1421,12 @@ nm_active_connection_class_init (NMActiveConnectionClass *ac_class)
|
|||
G_PARAM_READABLE |
|
||||
G_PARAM_STATIC_STRINGS);
|
||||
|
||||
obj_properties[PROP_STATE_FLAGS] =
|
||||
g_param_spec_uint (NM_ACTIVE_CONNECTION_STATE_FLAGS, "", "",
|
||||
0, G_MAXUINT32, NM_ACTIVATION_STATE_FLAG_NONE,
|
||||
G_PARAM_READABLE |
|
||||
G_PARAM_STATIC_STRINGS);
|
||||
|
||||
obj_properties[PROP_DEFAULT] =
|
||||
g_param_spec_boolean (NM_ACTIVE_CONNECTION_DEFAULT, "", "",
|
||||
FALSE,
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@
|
|||
#define NM_ACTIVE_CONNECTION_SPECIFIC_OBJECT "specific-object"
|
||||
#define NM_ACTIVE_CONNECTION_DEVICES "devices"
|
||||
#define NM_ACTIVE_CONNECTION_STATE "state"
|
||||
#define NM_ACTIVE_CONNECTION_STATE_FLAGS "state-flags"
|
||||
#define NM_ACTIVE_CONNECTION_DEFAULT "default"
|
||||
#define NM_ACTIVE_CONNECTION_IP4_CONFIG "ip4-config"
|
||||
#define NM_ACTIVE_CONNECTION_DHCP4_CONFIG "dhcp4-config"
|
||||
|
|
@ -145,6 +146,19 @@ void nm_active_connection_set_state (NMActiveConnection *self,
|
|||
NMActiveConnectionState state,
|
||||
NMActiveConnectionStateReason reason);
|
||||
|
||||
NMActivationStateFlags nm_active_connection_get_state_flags (NMActiveConnection *self);
|
||||
|
||||
void nm_active_connection_set_state_flags_full (NMActiveConnection *self,
|
||||
NMActivationStateFlags state_flags,
|
||||
NMActivationStateFlags mask);
|
||||
|
||||
static inline void
|
||||
nm_active_connection_set_state_flags (NMActiveConnection *self,
|
||||
NMActivationStateFlags state_flags)
|
||||
{
|
||||
nm_active_connection_set_state_flags_full (self, state_flags, state_flags);
|
||||
}
|
||||
|
||||
NMDevice * nm_active_connection_get_device (NMActiveConnection *self);
|
||||
|
||||
gboolean nm_active_connection_set_device (NMActiveConnection *self, NMDevice *device);
|
||||
|
|
|
|||
|
|
@ -1831,81 +1831,6 @@ nm_match_spec_join (GSList *specs)
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
char _nm_utils_to_string_buffer[];
|
||||
|
||||
void
|
||||
nm_utils_to_string_buffer_init (char **buf, gsize *len)
|
||||
{
|
||||
if (!*buf) {
|
||||
*buf = _nm_utils_to_string_buffer;
|
||||
*len = sizeof (_nm_utils_to_string_buffer);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
nm_utils_to_string_buffer_init_null (gconstpointer obj, char **buf, gsize *len)
|
||||
{
|
||||
nm_utils_to_string_buffer_init (buf, len);
|
||||
if (!obj) {
|
||||
g_strlcpy (*buf, "(null)", *len);
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
const char *
|
||||
nm_utils_flags2str (const NMUtilsFlags2StrDesc *descs,
|
||||
gsize n_descs,
|
||||
unsigned flags,
|
||||
char *buf,
|
||||
gsize len)
|
||||
{
|
||||
gsize i;
|
||||
char *p;
|
||||
|
||||
#if NM_MORE_ASSERTS > 10
|
||||
nm_assert (descs);
|
||||
nm_assert (n_descs > 0);
|
||||
for (i = 0; i < n_descs; i++) {
|
||||
gsize j;
|
||||
|
||||
nm_assert (descs[i].flag && nm_utils_is_power_of_two (descs[i].flag));
|
||||
nm_assert (descs[i].name && descs[i].name[0]);
|
||||
for (j = 0; j < i; j++)
|
||||
nm_assert (descs[j].flag != descs[i].flag);
|
||||
}
|
||||
#endif
|
||||
|
||||
nm_utils_to_string_buffer_init (&buf, &len);
|
||||
|
||||
if (!len)
|
||||
return buf;
|
||||
|
||||
buf[0] = '\0';
|
||||
if (!flags) {
|
||||
return buf;
|
||||
}
|
||||
|
||||
p = buf;
|
||||
for (i = 0; flags && i < n_descs; i++) {
|
||||
if (NM_FLAGS_HAS (flags, descs[i].flag)) {
|
||||
flags &= ~descs[i].flag;
|
||||
|
||||
if (buf[0] != '\0')
|
||||
nm_utils_strbuf_append_c (&p, &len, ',');
|
||||
nm_utils_strbuf_append_str (&p, &len, descs[i].name);
|
||||
}
|
||||
}
|
||||
if (flags) {
|
||||
if (buf[0] != '\0')
|
||||
nm_utils_strbuf_append_c (&p, &len, ',');
|
||||
nm_utils_strbuf_append (&p, &len, "0x%x", flags);
|
||||
}
|
||||
return buf;
|
||||
};
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
char *
|
||||
nm_utils_new_vlan_name (const char *parent_iface, guint32 vlan_id)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -212,72 +212,6 @@ NMMatchSpecMatchType nm_match_spec_config (const GSList *specs,
|
|||
GSList *nm_match_spec_split (const char *value);
|
||||
char *nm_match_spec_join (GSList *specs);
|
||||
|
||||
extern char _nm_utils_to_string_buffer[2096];
|
||||
|
||||
void nm_utils_to_string_buffer_init (char **buf, gsize *len);
|
||||
gboolean nm_utils_to_string_buffer_init_null (gconstpointer obj, char **buf, gsize *len);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
typedef struct {
|
||||
unsigned flag;
|
||||
const char *name;
|
||||
} NMUtilsFlags2StrDesc;
|
||||
|
||||
#define NM_UTILS_FLAGS2STR(f, n) { .flag = f, .name = ""n, }
|
||||
|
||||
#define _NM_UTILS_FLAGS2STR_DEFINE(scope, fcn_name, flags_type, ...) \
|
||||
scope const char * \
|
||||
fcn_name (flags_type flags, char *buf, gsize len) \
|
||||
{ \
|
||||
static const NMUtilsFlags2StrDesc descs[] = { \
|
||||
__VA_ARGS__ \
|
||||
}; \
|
||||
G_STATIC_ASSERT (sizeof (flags_type) <= sizeof (unsigned)); \
|
||||
return nm_utils_flags2str (descs, G_N_ELEMENTS (descs), flags, buf, len); \
|
||||
};
|
||||
|
||||
#define NM_UTILS_FLAGS2STR_DEFINE(fcn_name, flags_type, ...) \
|
||||
_NM_UTILS_FLAGS2STR_DEFINE (, fcn_name, flags_type, __VA_ARGS__)
|
||||
#define NM_UTILS_FLAGS2STR_DEFINE_STATIC(fcn_name, flags_type, ...) \
|
||||
_NM_UTILS_FLAGS2STR_DEFINE (static, fcn_name, flags_type, __VA_ARGS__)
|
||||
|
||||
const char *nm_utils_flags2str (const NMUtilsFlags2StrDesc *descs,
|
||||
gsize n_descs,
|
||||
unsigned flags,
|
||||
char *buf,
|
||||
gsize len);
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
#define NM_UTILS_ENUM2STR(v, n) (void) 0; case v: s = ""n""; break; (void) 0
|
||||
#define NM_UTILS_ENUM2STR_IGNORE(v) (void) 0; case v: break; (void) 0
|
||||
|
||||
#define _NM_UTILS_ENUM2STR_DEFINE(scope, fcn_name, lookup_type, int_fmt, ...) \
|
||||
scope const char * \
|
||||
fcn_name (lookup_type val, char *buf, gsize len) \
|
||||
{ \
|
||||
nm_utils_to_string_buffer_init (&buf, &len); \
|
||||
if (len) { \
|
||||
const char *s = NULL; \
|
||||
switch (val) { \
|
||||
(void) 0, \
|
||||
__VA_ARGS__ \
|
||||
(void) 0; \
|
||||
}; \
|
||||
if (s) \
|
||||
g_strlcpy (buf, s, len); \
|
||||
else \
|
||||
g_snprintf (buf, len, "(%"int_fmt")", val); \
|
||||
} \
|
||||
return buf; \
|
||||
}
|
||||
|
||||
#define NM_UTILS_ENUM2STR_DEFINE(fcn_name, lookup_type, ...) \
|
||||
_NM_UTILS_ENUM2STR_DEFINE (, fcn_name, lookup_type, "d", __VA_ARGS__)
|
||||
#define NM_UTILS_ENUM2STR_DEFINE_STATIC(fcn_name, lookup_type, ...) \
|
||||
_NM_UTILS_ENUM2STR_DEFINE (static, fcn_name, lookup_type, "d", __VA_ARGS__)
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
const char *nm_utils_get_ip_config_method (NMConnection *connection,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue