all: add device carrier flag

Add a new 'carrier' flag to the InterfaceFlags property of devices to
indicate the current carrier state.

The new flag is equivalent to the 'lower-up' flag for all devices
except the ones that use a non-standard carrier detection mechanism
like NMDeviceAdsl.
This commit is contained in:
Beniamino Galvani 2019-10-12 17:14:38 +02:00
parent 62c811b2bd
commit 2b7def052f
6 changed files with 851 additions and 593 deletions

View file

@ -571,6 +571,9 @@ _metagen_device_detail_interface_flags_get_fcn (NMC_META_GENERIC_INFO_GET_FCN_AR
case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_INTERFACE_FLAGS_LOWER_UP:
return nmc_meta_generic_get_bool (NM_FLAGS_HAS (flags, NM_DEVICE_INTERFACE_FLAG_LOWER_UP),
get_type);
case NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_INTERFACE_FLAGS_CARRIER:
return nmc_meta_generic_get_bool (NM_FLAGS_HAS (flags, NM_DEVICE_INTERFACE_FLAG_CARRIER),
get_type);
default:
break;
}
@ -583,6 +586,7 @@ const NmcMetaGenericInfo *const metagen_device_detail_interface_flags[_NMC_GENER
[type] = NMC_META_GENERIC(name, .info_type = type, .get_fcn = _metagen_device_detail_interface_flags_get_fcn)
_METAGEN_DEVICE_DETAIL_INTERFACE_FLAGS (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_INTERFACE_FLAGS_UP, "UP"),
_METAGEN_DEVICE_DETAIL_INTERFACE_FLAGS (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_INTERFACE_FLAGS_LOWER_UP, "LOWER-UP"),
_METAGEN_DEVICE_DETAIL_INTERFACE_FLAGS (NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_INTERFACE_FLAGS_CARRIER, "CARRIER"),
};
/*****************************************************************************/

View file

@ -218,6 +218,7 @@ typedef enum {
NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_INTERFACE_FLAGS_UP = 0,
NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_INTERFACE_FLAGS_LOWER_UP,
NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_INTERFACE_FLAGS_CARRIER,
_NMC_GENERIC_INFO_TYPE_DEVICE_DETAIL_INTERFACE_FLAGS_NUM,
} NmcGenericInfoType;

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1157,6 +1157,9 @@ typedef enum { /*< flags >*/
* administrative point of view. Corresponds to kernel IFF_UP.
* @NM_DEVICE_INTERFACE_FLAG_LOWER_UP: the physical link is up. Corresponds
* to kernel IFF_LOWER_UP.
* @NM_DEVICE_INTERFACE_FLAG_CARRIER: the interface has carrier. In most
* cases this is equal to the value of @NM_DEVICE_INTERFACE_FLAG_LOWER_UP.
* However some devices have a non-standard carrier detection mechanism.
*
* Flags for a network interface.
*
@ -1167,6 +1170,8 @@ typedef enum { /*< flags >*/
NM_DEVICE_INTERFACE_FLAG_NONE = 0, /*< skip >*/
NM_DEVICE_INTERFACE_FLAG_UP = 0x1,
NM_DEVICE_INTERFACE_FLAG_LOWER_UP = 0x2,
/* NM-specific flags */
NM_DEVICE_INTERFACE_FLAG_CARRIER = 0x10000,
} NMDeviceInterfaceFlags;
#endif /* __NM_DBUS_INTERFACE_H__ */

View file

@ -3604,12 +3604,26 @@ nm_device_set_carrier (NMDevice *self, gboolean carrier)
{
NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
NMDeviceState state = nm_device_get_state (self);
gboolean notify_flags = FALSE;
if (priv->carrier == carrier)
return;
if (NM_FLAGS_ALL (priv->capabilities,
NM_DEVICE_CAP_CARRIER_DETECT
| NM_DEVICE_CAP_NONSTANDARD_CARRIER)) {
if (carrier)
priv->interface_flags |= NM_DEVICE_INTERFACE_FLAG_CARRIER;
else
priv->interface_flags &= ~NM_DEVICE_INTERFACE_FLAG_CARRIER;
notify_flags = TRUE;
}
priv->carrier = carrier;
_notify (self, PROP_CARRIER);
if (notify_flags)
nm_gobject_notify_together (self, PROP_CARRIER, PROP_INTERFACE_FLAGS);
else
_notify (self, PROP_CARRIER);
if (priv->carrier) {
_LOGI (LOGD_DEVICE, "carrier: link connected");
@ -3817,6 +3831,16 @@ device_update_interface_flags (NMDevice *self, const NMPlatformLink *plink)
if (plink && NM_FLAGS_HAS (plink->n_ifi_flags, IFF_LOWER_UP))
flags |= NM_DEVICE_INTERFACE_FLAG_LOWER_UP;
if (NM_FLAGS_ALL (priv->capabilities,
NM_DEVICE_CAP_CARRIER_DETECT
| NM_DEVICE_CAP_NONSTANDARD_CARRIER)) {
if (priv->carrier)
flags |= NM_DEVICE_INTERFACE_FLAG_CARRIER;
} else {
if (plink && NM_FLAGS_HAS (plink->n_ifi_flags, IFF_LOWER_UP))
flags |= NM_DEVICE_INTERFACE_FLAG_CARRIER;
}
if (flags != priv->interface_flags) {
priv->interface_flags = flags;
_notify (self, PROP_INTERFACE_FLAGS);