/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
 * Copyright (C) 2004 - 2018 Red Hat, Inc.
 */

/* Definitions related to NetworkManager's D-Bus interfaces.
 *
 * Note that although this header is installed as part of libnm, it is also
 * used by some external code that does not link to libnm.
 */

#ifndef __NM_DBUS_INTERFACE_H__
#define __NM_DBUS_INTERFACE_H__

/* This header must not include glib or libnm. */

#ifndef NM_VERSION_H
#define NM_AVAILABLE_IN_1_2
#define NM_AVAILABLE_IN_1_8
#endif

/*
 * dbus services details
 */
#define NM_DBUS_SERVICE "org.freedesktop.NetworkManager"

#define NM_DBUS_INTERFACE                      "org.freedesktop.NetworkManager"
#define NM_DBUS_INTERFACE_ACCESS_POINT         NM_DBUS_INTERFACE ".AccessPoint"
#define NM_DBUS_INTERFACE_ACTIVE_CONNECTION    NM_DBUS_INTERFACE ".Connection.Active"
#define NM_DBUS_INTERFACE_CHECKPOINT           NM_DBUS_INTERFACE ".Checkpoint"
#define NM_DBUS_INTERFACE_DEVICE               NM_DBUS_INTERFACE ".Device"
#define NM_DBUS_INTERFACE_DEVICE_6LOWPAN       NM_DBUS_INTERFACE_DEVICE ".Lowpan"
#define NM_DBUS_INTERFACE_DEVICE_ADSL          NM_DBUS_INTERFACE_DEVICE ".Adsl"
#define NM_DBUS_INTERFACE_DEVICE_BLUETOOTH     NM_DBUS_INTERFACE_DEVICE ".Bluetooth"
#define NM_DBUS_INTERFACE_DEVICE_BOND          NM_DBUS_INTERFACE_DEVICE ".Bond"
#define NM_DBUS_INTERFACE_DEVICE_BRIDGE        NM_DBUS_INTERFACE_DEVICE ".Bridge"
#define NM_DBUS_INTERFACE_DEVICE_DUMMY         NM_DBUS_INTERFACE_DEVICE ".Dummy"
#define NM_DBUS_INTERFACE_DEVICE_GENERIC       NM_DBUS_INTERFACE_DEVICE ".Generic"
#define NM_DBUS_INTERFACE_DEVICE_GRE           NM_DBUS_INTERFACE_DEVICE ".Gre"
#define NM_DBUS_INTERFACE_DEVICE_HSR           NM_DBUS_INTERFACE_DEVICE ".Hsr"
#define NM_DBUS_INTERFACE_DEVICE_INFINIBAND    NM_DBUS_INTERFACE_DEVICE ".Infiniband"
#define NM_DBUS_INTERFACE_DEVICE_IP_TUNNEL     NM_DBUS_INTERFACE_DEVICE ".IPTunnel"
#define NM_DBUS_INTERFACE_DEVICE_LOOPBACK      NM_DBUS_INTERFACE_DEVICE ".Loopback"
#define NM_DBUS_INTERFACE_DEVICE_MACSEC        NM_DBUS_INTERFACE_DEVICE ".Macsec"
#define NM_DBUS_INTERFACE_DEVICE_MACVLAN       NM_DBUS_INTERFACE_DEVICE ".Macvlan"
#define NM_DBUS_INTERFACE_DEVICE_MODEM         NM_DBUS_INTERFACE_DEVICE ".Modem"
#define NM_DBUS_INTERFACE_DEVICE_OLPC_MESH     NM_DBUS_INTERFACE_DEVICE ".OlpcMesh"
#define NM_DBUS_INTERFACE_DEVICE_OVS_BRIDGE    NM_DBUS_INTERFACE_DEVICE ".OvsBridge"
#define NM_DBUS_INTERFACE_DEVICE_OVS_INTERFACE NM_DBUS_INTERFACE_DEVICE ".OvsInterface"
#define NM_DBUS_INTERFACE_DEVICE_OVS_PORT      NM_DBUS_INTERFACE_DEVICE ".OvsPort"
#define NM_DBUS_INTERFACE_DEVICE_PPP           NM_DBUS_INTERFACE_DEVICE ".Ppp"
#define NM_DBUS_INTERFACE_DEVICE_STATISTICS    NM_DBUS_INTERFACE_DEVICE ".Statistics"
#define NM_DBUS_INTERFACE_DEVICE_TEAM          NM_DBUS_INTERFACE_DEVICE ".Team"
#define NM_DBUS_INTERFACE_DEVICE_TUN           NM_DBUS_INTERFACE_DEVICE ".Tun"
#define NM_DBUS_INTERFACE_DEVICE_VETH          NM_DBUS_INTERFACE_DEVICE ".Veth"
#define NM_DBUS_INTERFACE_DEVICE_VLAN          NM_DBUS_INTERFACE_DEVICE ".Vlan"
#define NM_DBUS_INTERFACE_DEVICE_VRF           NM_DBUS_INTERFACE_DEVICE ".Vrf"
#define NM_DBUS_INTERFACE_DEVICE_VXLAN         NM_DBUS_INTERFACE_DEVICE ".Vxlan"
#define NM_DBUS_INTERFACE_DEVICE_WIFI_P2P      NM_DBUS_INTERFACE_DEVICE ".WifiP2P"
#define NM_DBUS_INTERFACE_DEVICE_WIMAX         NM_DBUS_INTERFACE_DEVICE ".WiMax"
#define NM_DBUS_INTERFACE_DEVICE_WIRED         NM_DBUS_INTERFACE_DEVICE ".Wired"
#define NM_DBUS_INTERFACE_DEVICE_WIREGUARD     NM_DBUS_INTERFACE_DEVICE ".WireGuard"
#define NM_DBUS_INTERFACE_DEVICE_WIRELESS      NM_DBUS_INTERFACE_DEVICE ".Wireless"
#define NM_DBUS_INTERFACE_DEVICE_WPAN          NM_DBUS_INTERFACE_DEVICE ".Wpan"
#define NM_DBUS_INTERFACE_DHCP4_CONFIG         NM_DBUS_INTERFACE ".DHCP4Config"
#define NM_DBUS_INTERFACE_DHCP6_CONFIG         NM_DBUS_INTERFACE ".DHCP6Config"
#define NM_DBUS_INTERFACE_IP4_CONFIG           NM_DBUS_INTERFACE ".IP4Config"
#define NM_DBUS_INTERFACE_IP6_CONFIG           NM_DBUS_INTERFACE ".IP6Config"
#define NM_DBUS_INTERFACE_WIFI_P2P_PEER        NM_DBUS_INTERFACE ".WifiP2PPeer"
#define NM_DBUS_INTERFACE_WIMAX_NSP            NM_DBUS_INTERFACE ".WiMax.Nsp"

#define NM_DBUS_PATH               "/org/freedesktop/NetworkManager"
#define NM_DBUS_PATH_ACCESS_POINT  NM_DBUS_PATH "/AccessPoint"
#define NM_DBUS_PATH_WIFI_P2P_PEER NM_DBUS_PATH "/WifiP2PPeer"
#define NM_DBUS_PATH_WIMAX_NSP     NM_DBUS_PATH "/Nsp"

#define NM_DBUS_INTERFACE_SETTINGS "org.freedesktop.NetworkManager.Settings"
#define NM_DBUS_PATH_SETTINGS      "/org/freedesktop/NetworkManager/Settings"

#define NM_DBUS_INTERFACE_SETTINGS_CONNECTION "org.freedesktop.NetworkManager.Settings.Connection"
#define NM_DBUS_PATH_SETTINGS_CONNECTION      "/org/freedesktop/NetworkManager/Settings/Connection"
#define NM_DBUS_INTERFACE_SETTINGS_CONNECTION_SECRETS \
    "org.freedesktop.NetworkManager.Settings.Connection.Secrets"

#define NM_DBUS_INTERFACE_AGENT_MANAGER NM_DBUS_INTERFACE ".AgentManager"
#define NM_DBUS_PATH_AGENT_MANAGER      "/org/freedesktop/NetworkManager/AgentManager"

#define NM_DBUS_INTERFACE_SECRET_AGENT NM_DBUS_INTERFACE ".SecretAgent"
#define NM_DBUS_PATH_SECRET_AGENT      "/org/freedesktop/NetworkManager/SecretAgent"

#define NM_DBUS_INTERFACE_DNS_MANAGER "org.freedesktop.NetworkManager.DnsManager"
#define NM_DBUS_PATH_DNS_MANAGER      "/org/freedesktop/NetworkManager/DnsManager"

/**
 * NMVersionInfoCapability:
 * %_NM_VERSION_INFO_CAPABILITY_UNUSED: a dummy capability. It has no meaning,
 *   don't use it.
 *
 * Currently no enum values are defined. These capabilities are exposed
 * on D-Bus in the "VersionInfo" bit field.
 *
 * Since: 1.42
 */
typedef enum {
    _NM_VERSION_INFO_CAPABILITY_UNUSED = 0x7FFFFFFFu,
} NMVersionInfoCapability;

/**
 * NMCapability:
 * @NM_CAPABILITY_TEAM: Teams can be managed. This means the team device plugin
 *   is loaded.
 * @NM_CAPABILITY_OVS: OpenVSwitch can be managed. This means the OVS device plugin
 *   is loaded. Since: 1.24.
 *
 * #NMCapability names the numbers in the Capabilities property.
 * Capabilities are positive numbers. They are part of stable API
 * and a certain capability number is guaranteed not to change.
 *
 * The range 0x7000 - 0x7FFF of capabilities is guaranteed not to be
 * used by upstream NetworkManager. It could thus be used for downstream
 * extensions.
 *
 * Since: 1.6
 */
typedef enum {
    NM_CAPABILITY_TEAM = 1,
    NM_CAPABILITY_OVS  = 2,
} NMCapability;

/**
 * NMState:
 * @NM_STATE_UNKNOWN: Networking state is unknown. This indicates a daemon error
 *    that makes it unable to reasonably assess the state. In such event the
 *    applications are expected to assume Internet connectivity might be present
 *    and not disable controls that require network access.
 *    The graphical shells may hide the network accessibility indicator altogether
 *    since no meaningful status indication can be provided.
 * @NM_STATE_ASLEEP: Networking is not enabled, the system is being suspended or
 *    resumed from suspend.
 * @NM_STATE_DISCONNECTED: There is no active network connection.
 *    The graphical shell should indicate  no network connectivity and the
 *    applications should not attempt to access the network.
 * @NM_STATE_DISCONNECTING: Network connections are being cleaned up.
 *    The applications should tear down their network sessions.
 * @NM_STATE_CONNECTING: A network connection is being started
 *    The graphical shell should indicate the network is being connected while
 *    the applications should still make no attempts to connect the network.
 * @NM_STATE_CONNECTED_LOCAL: There is only local IPv4 and/or IPv6 connectivity,
 *    but no default route to access the Internet. The graphical shell should
 *    indicate no network connectivity.
 * @NM_STATE_CONNECTED_SITE: There is only site-wide IPv4 and/or IPv6 connectivity.
 *    This means a default route is available, but the Internet connectivity check
 *    (see "Connectivity" property) did not succeed. The graphical shell should
 *    indicate limited network connectivity.
 * @NM_STATE_CONNECTED_GLOBAL: There is global IPv4 and/or IPv6 Internet connectivity
 *    This means the Internet connectivity check succeeded, the graphical shell should
 *    indicate full network connectivity.
 *
 * #NMState values indicate the current overall networking state.
 **/
typedef enum {
    NM_STATE_UNKNOWN          = 0,
    NM_STATE_ASLEEP           = 10,
    NM_STATE_DISCONNECTED     = 20,
    NM_STATE_DISCONNECTING    = 30,
    NM_STATE_CONNECTING       = 40,
    NM_STATE_CONNECTED_LOCAL  = 50,
    NM_STATE_CONNECTED_SITE   = 60,
    NM_STATE_CONNECTED_GLOBAL = 70,
} NMState;

/**
 * NMConnectivityState:
 * @NM_CONNECTIVITY_UNKNOWN: Network connectivity is unknown. This means the
 *   connectivity checks are disabled (e.g. on server installations) or has
 *   not run yet. The graphical shell should assume the Internet connection
 *   might be available and not present a captive portal window.
 * @NM_CONNECTIVITY_NONE: The host is not connected to any network. There's
 *   no active connection that contains a default route to the internet and
 *   thus it makes no sense to even attempt a connectivity check. The graphical
 *   shell should use this state to indicate the network connection is unavailable.
 * @NM_CONNECTIVITY_PORTAL: The Internet connection is hijacked by a captive
 *   portal gateway. The graphical shell may open a sandboxed web browser window
 *   (because the captive portals typically attempt a man-in-the-middle attacks
 *   against the https connections) for the purpose of authenticating to a gateway
 *   and retrigger the connectivity check with CheckConnectivity() when the
 *   browser window is dismissed.
 * @NM_CONNECTIVITY_LIMITED: The host is connected to a network, does not appear
 *   to be able to reach the full Internet, but a captive portal has not been
 *   detected.
 * @NM_CONNECTIVITY_FULL: The host is connected to a network, and
 *   appears to be able to reach the full Internet.
 */
typedef enum {
    NM_CONNECTIVITY_UNKNOWN = 0,
    NM_CONNECTIVITY_NONE    = 1,
    NM_CONNECTIVITY_PORTAL  = 2,
    NM_CONNECTIVITY_LIMITED = 3,
    NM_CONNECTIVITY_FULL    = 4,
} NMConnectivityState;

/**
 * NMDeviceType:
 * @NM_DEVICE_TYPE_UNKNOWN: unknown device
 * @NM_DEVICE_TYPE_GENERIC: generic support for unrecognized device types
 * @NM_DEVICE_TYPE_ETHERNET: a wired ethernet device
 * @NM_DEVICE_TYPE_WIFI: an 802.11 Wi-Fi device
 * @NM_DEVICE_TYPE_UNUSED1: not used
 * @NM_DEVICE_TYPE_UNUSED2: not used
 * @NM_DEVICE_TYPE_BT: a Bluetooth device supporting PAN or DUN access protocols
 * @NM_DEVICE_TYPE_OLPC_MESH: an OLPC XO mesh networking device
 * @NM_DEVICE_TYPE_WIMAX: an 802.16e Mobile WiMAX broadband device
 * @NM_DEVICE_TYPE_MODEM: a modem supporting analog telephone, CDMA/EVDO,
 * GSM/UMTS, or LTE network access protocols
 * @NM_DEVICE_TYPE_INFINIBAND: an IP-over-InfiniBand device
 * @NM_DEVICE_TYPE_BOND: a bond master interface
 * @NM_DEVICE_TYPE_VLAN: an 802.1Q VLAN interface
 * @NM_DEVICE_TYPE_ADSL: ADSL modem
 * @NM_DEVICE_TYPE_BRIDGE: a bridge master interface
 * @NM_DEVICE_TYPE_TEAM: a team master interface
 * @NM_DEVICE_TYPE_TUN: a TUN or TAP interface
 * @NM_DEVICE_TYPE_IP_TUNNEL: a IP tunnel interface
 * @NM_DEVICE_TYPE_MACVLAN: a MACVLAN interface
 * @NM_DEVICE_TYPE_VXLAN: a VXLAN interface
 * @NM_DEVICE_TYPE_VETH: a VETH interface
 * @NM_DEVICE_TYPE_MACSEC: a MACsec interface
 * @NM_DEVICE_TYPE_DUMMY: a dummy interface
 * @NM_DEVICE_TYPE_PPP: a PPP interface
 * @NM_DEVICE_TYPE_OVS_INTERFACE: a Open vSwitch interface
 * @NM_DEVICE_TYPE_OVS_PORT: a Open vSwitch port
 * @NM_DEVICE_TYPE_OVS_BRIDGE: a Open vSwitch bridge
 * @NM_DEVICE_TYPE_WPAN: a IEEE 802.15.4 (WPAN) MAC Layer Device
 * @NM_DEVICE_TYPE_6LOWPAN: 6LoWPAN interface
 * @NM_DEVICE_TYPE_WIREGUARD: a WireGuard interface
 * @NM_DEVICE_TYPE_WIFI_P2P: an 802.11 Wi-Fi P2P device. Since: 1.16.
 * @NM_DEVICE_TYPE_VRF: A VRF (Virtual Routing and Forwarding) interface. Since: 1.24.
 * @NM_DEVICE_TYPE_LOOPBACK: a loopback interface. Since: 1.42.
 * @NM_DEVICE_TYPE_HSR: A HSR/PRP device. Since: 1.46.
 *
 * #NMDeviceType values indicate the type of hardware represented by a
 * device object.
 **/
typedef enum {
    NM_DEVICE_TYPE_UNKNOWN       = 0,
    NM_DEVICE_TYPE_ETHERNET      = 1,
    NM_DEVICE_TYPE_WIFI          = 2,
    NM_DEVICE_TYPE_UNUSED1       = 3,
    NM_DEVICE_TYPE_UNUSED2       = 4,
    NM_DEVICE_TYPE_BT            = 5, /* Bluetooth */
    NM_DEVICE_TYPE_OLPC_MESH     = 6,
    NM_DEVICE_TYPE_WIMAX         = 7,
    NM_DEVICE_TYPE_MODEM         = 8,
    NM_DEVICE_TYPE_INFINIBAND    = 9,
    NM_DEVICE_TYPE_BOND          = 10,
    NM_DEVICE_TYPE_VLAN          = 11,
    NM_DEVICE_TYPE_ADSL          = 12,
    NM_DEVICE_TYPE_BRIDGE        = 13,
    NM_DEVICE_TYPE_GENERIC       = 14,
    NM_DEVICE_TYPE_TEAM          = 15,
    NM_DEVICE_TYPE_TUN           = 16,
    NM_DEVICE_TYPE_IP_TUNNEL     = 17,
    NM_DEVICE_TYPE_MACVLAN       = 18,
    NM_DEVICE_TYPE_VXLAN         = 19,
    NM_DEVICE_TYPE_VETH          = 20,
    NM_DEVICE_TYPE_MACSEC        = 21,
    NM_DEVICE_TYPE_DUMMY         = 22,
    NM_DEVICE_TYPE_PPP           = 23,
    NM_DEVICE_TYPE_OVS_INTERFACE = 24,
    NM_DEVICE_TYPE_OVS_PORT      = 25,
    NM_DEVICE_TYPE_OVS_BRIDGE    = 26,
    NM_DEVICE_TYPE_WPAN          = 27,
    NM_DEVICE_TYPE_6LOWPAN       = 28,
    NM_DEVICE_TYPE_WIREGUARD     = 29,
    NM_DEVICE_TYPE_WIFI_P2P      = 30,
    NM_DEVICE_TYPE_VRF           = 31,
    NM_DEVICE_TYPE_LOOPBACK      = 32,
    NM_DEVICE_TYPE_HSR           = 33,
} NMDeviceType;

/**
 * NMDeviceCapabilities:
 * @NM_DEVICE_CAP_NONE: device has no special capabilities
 * @NM_DEVICE_CAP_NM_SUPPORTED: NetworkManager supports this device
 * @NM_DEVICE_CAP_CARRIER_DETECT: this device can indicate carrier status
 * @NM_DEVICE_CAP_IS_SOFTWARE: this device is a software device
 * @NM_DEVICE_CAP_SRIOV: this device supports single-root I/O virtualization
 *
 * General device capability flags.
 **/
typedef enum /*< flags >*/ {
    NM_DEVICE_CAP_NONE           = 0x00000000,
    NM_DEVICE_CAP_NM_SUPPORTED   = 0x00000001,
    NM_DEVICE_CAP_CARRIER_DETECT = 0x00000002,
    NM_DEVICE_CAP_IS_SOFTWARE    = 0x00000004,
    NM_DEVICE_CAP_SRIOV          = 0x00000008,
} NMDeviceCapabilities;

/**
 * NMDeviceWifiCapabilities:
 * @NM_WIFI_DEVICE_CAP_NONE: device has no encryption/authentication capabilities
 * @NM_WIFI_DEVICE_CAP_CIPHER_WEP40: device supports 40/64-bit WEP encryption
 * @NM_WIFI_DEVICE_CAP_CIPHER_WEP104: device supports 104/128-bit WEP encryption
 * @NM_WIFI_DEVICE_CAP_CIPHER_TKIP: device supports TKIP encryption
 * @NM_WIFI_DEVICE_CAP_CIPHER_CCMP: device supports AES/CCMP encryption
 * @NM_WIFI_DEVICE_CAP_WPA: device supports WPA1 authentication
 * @NM_WIFI_DEVICE_CAP_RSN: device supports WPA2/RSN authentication
 * @NM_WIFI_DEVICE_CAP_AP: device supports Access Point mode
 * @NM_WIFI_DEVICE_CAP_ADHOC: device supports Ad-Hoc mode
 * @NM_WIFI_DEVICE_CAP_FREQ_VALID: device reports frequency capabilities
 * @NM_WIFI_DEVICE_CAP_FREQ_2GHZ: device supports 2.4GHz frequencies
 * @NM_WIFI_DEVICE_CAP_FREQ_5GHZ: device supports 5GHz frequencies
 * @NM_WIFI_DEVICE_CAP_FREQ_6GHZ: device supports 6GHz frequencies. Since: 1.46.
 * @NM_WIFI_DEVICE_CAP_MESH: device supports acting as a mesh point. Since: 1.20.
 * @NM_WIFI_DEVICE_CAP_IBSS_RSN: device supports WPA2/RSN in an IBSS network. Since: 1.22.
 *
 * 802.11 specific device encryption and authentication capabilities.
 **/
typedef enum /*< flags >*/ {
    NM_WIFI_DEVICE_CAP_NONE          = 0x00000000,
    NM_WIFI_DEVICE_CAP_CIPHER_WEP40  = 0x00000001,
    NM_WIFI_DEVICE_CAP_CIPHER_WEP104 = 0x00000002,
    NM_WIFI_DEVICE_CAP_CIPHER_TKIP   = 0x00000004,
    NM_WIFI_DEVICE_CAP_CIPHER_CCMP   = 0x00000008,
    NM_WIFI_DEVICE_CAP_WPA           = 0x00000010,
    NM_WIFI_DEVICE_CAP_RSN           = 0x00000020,
    NM_WIFI_DEVICE_CAP_AP            = 0x00000040,
    NM_WIFI_DEVICE_CAP_ADHOC         = 0x00000080,
    NM_WIFI_DEVICE_CAP_FREQ_VALID    = 0x00000100,
    NM_WIFI_DEVICE_CAP_FREQ_2GHZ     = 0x00000200,
    NM_WIFI_DEVICE_CAP_FREQ_5GHZ     = 0x00000400,
    NM_WIFI_DEVICE_CAP_FREQ_6GHZ     = 0x00000800,
    NM_WIFI_DEVICE_CAP_MESH          = 0x00001000,
    NM_WIFI_DEVICE_CAP_IBSS_RSN      = 0x00002000,
} NMDeviceWifiCapabilities;

/**
 * NM80211ApFlags:
 * @NM_802_11_AP_FLAGS_NONE: access point has no special capabilities
 * @NM_802_11_AP_FLAGS_PRIVACY: access point requires authentication and
 * encryption (usually means WEP)
 * @NM_802_11_AP_FLAGS_WPS: access point supports some WPS method
 * @NM_802_11_AP_FLAGS_WPS_PBC: access point supports push-button WPS
 * @NM_802_11_AP_FLAGS_WPS_PIN: access point supports PIN-based WPS
 *
 * 802.11 access point flags.
 **/
typedef enum /*< underscore_name=nm_802_11_ap_flags, flags >*/ {
    NM_802_11_AP_FLAGS_NONE    = 0x00000000,
    NM_802_11_AP_FLAGS_PRIVACY = 0x00000001,
    NM_802_11_AP_FLAGS_WPS     = 0x00000002,
    NM_802_11_AP_FLAGS_WPS_PBC = 0x00000004,
    NM_802_11_AP_FLAGS_WPS_PIN = 0x00000008,
} NM80211ApFlags;

/**
 * NM80211ApSecurityFlags:
 * @NM_802_11_AP_SEC_NONE: the access point has no special security requirements
 * @NM_802_11_AP_SEC_PAIR_WEP40: 40/64-bit WEP is supported for
 * pairwise/unicast encryption
 * @NM_802_11_AP_SEC_PAIR_WEP104: 104/128-bit WEP is supported for
 * pairwise/unicast encryption
 * @NM_802_11_AP_SEC_PAIR_TKIP: TKIP is supported for pairwise/unicast encryption
 * @NM_802_11_AP_SEC_PAIR_CCMP: AES/CCMP is supported for pairwise/unicast encryption
 * @NM_802_11_AP_SEC_GROUP_WEP40: 40/64-bit WEP is supported for group/broadcast
 * encryption
 * @NM_802_11_AP_SEC_GROUP_WEP104: 104/128-bit WEP is supported for
 * group/broadcast encryption
 * @NM_802_11_AP_SEC_GROUP_TKIP: TKIP is supported for group/broadcast encryption
 * @NM_802_11_AP_SEC_GROUP_CCMP: AES/CCMP is supported for group/broadcast
 * encryption
 * @NM_802_11_AP_SEC_KEY_MGMT_PSK: WPA/RSN Pre-Shared Key encryption is
 * supported
 * @NM_802_11_AP_SEC_KEY_MGMT_802_1X: 802.1x authentication and key management
 * is supported
 * @NM_802_11_AP_SEC_KEY_MGMT_SAE: WPA/RSN Simultaneous Authentication of Equals is
 * supported
 * @NM_802_11_AP_SEC_KEY_MGMT_OWE: WPA/RSN Opportunistic Wireless Encryption is
 * supported
 * @NM_802_11_AP_SEC_KEY_MGMT_OWE_TM: WPA/RSN Opportunistic Wireless Encryption
 * transition mode is supported. Since: 1.26.
 * @NM_802_11_AP_SEC_KEY_MGMT_EAP_SUITE_B_192: WPA3 Enterprise Suite-B 192 bit mode
 * is supported. Since: 1.30.
 *
 * 802.11 access point security and authentication flags.  These flags describe
 * the current security requirements of an access point as determined from the
 * access point's beacon.
 **/
typedef enum /*< underscore_name=nm_802_11_ap_security_flags, flags >*/ {
    NM_802_11_AP_SEC_NONE                     = 0x00000000,
    NM_802_11_AP_SEC_PAIR_WEP40               = 0x00000001,
    NM_802_11_AP_SEC_PAIR_WEP104              = 0x00000002,
    NM_802_11_AP_SEC_PAIR_TKIP                = 0x00000004,
    NM_802_11_AP_SEC_PAIR_CCMP                = 0x00000008,
    NM_802_11_AP_SEC_GROUP_WEP40              = 0x00000010,
    NM_802_11_AP_SEC_GROUP_WEP104             = 0x00000020,
    NM_802_11_AP_SEC_GROUP_TKIP               = 0x00000040,
    NM_802_11_AP_SEC_GROUP_CCMP               = 0x00000080,
    NM_802_11_AP_SEC_KEY_MGMT_PSK             = 0x00000100,
    NM_802_11_AP_SEC_KEY_MGMT_802_1X          = 0x00000200,
    NM_802_11_AP_SEC_KEY_MGMT_SAE             = 0x00000400,
    NM_802_11_AP_SEC_KEY_MGMT_OWE             = 0x00000800,
    NM_802_11_AP_SEC_KEY_MGMT_OWE_TM          = 0x00001000,
    NM_802_11_AP_SEC_KEY_MGMT_EAP_SUITE_B_192 = 0x00002000,
} NM80211ApSecurityFlags;

/**
 * NM80211Mode:
 * @NM_802_11_MODE_UNKNOWN: the device or access point mode is unknown
 * @NM_802_11_MODE_ADHOC: for both devices and access point objects, indicates
 *   the object is part of an Ad-Hoc 802.11 network without a central
 *   coordinating access point.
 * @NM_802_11_MODE_INFRA: the device or access point is in infrastructure mode.
 *   For devices, this indicates the device is an 802.11 client/station.  For
 *   access point objects, this indicates the object is an access point that
 *   provides connectivity to clients.
 * @NM_802_11_MODE_AP: the device is an access point/hotspot.  Not valid for
 *   access point objects; used only for hotspot mode on the local machine.
 * @NM_802_11_MODE_MESH: the device is a 802.11s mesh point. Since: 1.20.
 *
 * Indicates the 802.11 mode an access point or device is currently in.
 **/
typedef enum { /*< underscore_name=nm_802_11_mode >*/
               NM_802_11_MODE_UNKNOWN = 0,
               NM_802_11_MODE_ADHOC   = 1,
               NM_802_11_MODE_INFRA   = 2,
               NM_802_11_MODE_AP      = 3,
               NM_802_11_MODE_MESH    = 4,
} NM80211Mode;

/**
 * NMBluetoothCapabilities:
 * @NM_BT_CAPABILITY_NONE: device has no usable capabilities
 * @NM_BT_CAPABILITY_DUN: device provides Dial-Up Networking capability
 * @NM_BT_CAPABILITY_NAP: device provides Network Access Point capability
 *
 * #NMBluetoothCapabilities values indicate the usable capabilities of a
 * Bluetooth device.
 **/
typedef enum /*< flags >*/ {
    NM_BT_CAPABILITY_NONE = 0x00000000,
    NM_BT_CAPABILITY_DUN  = 0x00000001,
    NM_BT_CAPABILITY_NAP  = 0x00000002,
} NMBluetoothCapabilities;

/**
 * NMDeviceModemCapabilities:
 * @NM_DEVICE_MODEM_CAPABILITY_NONE: modem has no usable capabilities
 * @NM_DEVICE_MODEM_CAPABILITY_POTS: modem uses the analog wired telephone
 * network and is not a wireless/cellular device
 * @NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO: modem supports at least one of CDMA
 * 1xRTT, EVDO revision 0, EVDO revision A, or EVDO revision B
 * @NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS: modem supports at least one of GSM,
 * GPRS, EDGE, UMTS, HSDPA, HSUPA, or HSPA+ packet switched data capability
 * @NM_DEVICE_MODEM_CAPABILITY_LTE: modem has LTE data capability
 * @NM_DEVICE_MODEM_CAPABILITY_5GNR: modem has 5GNR data capability. Since: 1.36.
 *
 * #NMDeviceModemCapabilities values indicate the generic radio access
 * technology families a modem device supports.  For more information on the
 * specific access technologies the device supports use the ModemManager D-Bus
 * API.
 **/
typedef enum /*< flags >*/ {
    NM_DEVICE_MODEM_CAPABILITY_NONE      = 0x00000000,
    NM_DEVICE_MODEM_CAPABILITY_POTS      = 0x00000001,
    NM_DEVICE_MODEM_CAPABILITY_CDMA_EVDO = 0x00000002,
    NM_DEVICE_MODEM_CAPABILITY_GSM_UMTS  = 0x00000004,
    NM_DEVICE_MODEM_CAPABILITY_LTE       = 0x00000008,
    NM_DEVICE_MODEM_CAPABILITY_5GNR      = 0x00000040,
} NMDeviceModemCapabilities;
/* Note: the numeric values of NMDeviceModemCapabilities must be identical to the values
 * in MMModemCapability. See the G_STATIC_ASSERT() in nm-modem-broadband.c's get_capabilities().  */

/**
 * NMWimaxNspNetworkType:
 * @NM_WIMAX_NSP_NETWORK_TYPE_UNKNOWN: unknown network type
 * @NM_WIMAX_NSP_NETWORK_TYPE_HOME: home network
 * @NM_WIMAX_NSP_NETWORK_TYPE_PARTNER: partner network
 * @NM_WIMAX_NSP_NETWORK_TYPE_ROAMING_PARTNER: roaming partner network
 *
 * WiMAX network type.
 */
typedef enum {
    NM_WIMAX_NSP_NETWORK_TYPE_UNKNOWN         = 0,
    NM_WIMAX_NSP_NETWORK_TYPE_HOME            = 1,
    NM_WIMAX_NSP_NETWORK_TYPE_PARTNER         = 2,
    NM_WIMAX_NSP_NETWORK_TYPE_ROAMING_PARTNER = 3,
} NMWimaxNspNetworkType;

/**
 * NMDeviceState:
 * @NM_DEVICE_STATE_UNKNOWN: the device's state is unknown
 * @NM_DEVICE_STATE_UNMANAGED: the device is recognized, but not managed by
 *   NetworkManager
 * @NM_DEVICE_STATE_UNAVAILABLE: the device is managed by NetworkManager, but
 *   is not available for use.  Reasons may include the wireless switched off,
 *   missing firmware, no ethernet carrier, missing supplicant or modem manager,
 *   etc.
 * @NM_DEVICE_STATE_DISCONNECTED: the device can be activated, but is currently
 *   idle and not connected to a network.
 * @NM_DEVICE_STATE_PREPARE: the device is preparing the connection to the
 *   network.  This may include operations like changing the MAC address,
 *   setting physical link properties, and anything else required to connect
 *   to the requested network.
 * @NM_DEVICE_STATE_CONFIG: the device is connecting to the requested network.
 *   This may include operations like associating with the Wi-Fi AP, dialing
 *   the modem, connecting to the remote Bluetooth device, etc.
 * @NM_DEVICE_STATE_NEED_AUTH: the device requires more information to continue
 *   connecting to the requested network.  This includes secrets like WiFi
 *   passphrases, login passwords, PIN codes, etc.
 * @NM_DEVICE_STATE_IP_CONFIG: the device is requesting IPv4 and/or IPv6
 *   addresses and routing information from the network.
 * @NM_DEVICE_STATE_IP_CHECK: the device is checking whether further action is
 *   required for the requested network connection.  This may include checking
 *   whether only local network access is available, whether a captive portal
 *   is blocking access to the Internet, etc.
 * @NM_DEVICE_STATE_SECONDARIES: the device is waiting for a secondary
 *   connection (like a VPN) which must activated before the device can be
 *   activated
 * @NM_DEVICE_STATE_ACTIVATED: the device has a network connection, either local
 *   or global.
 * @NM_DEVICE_STATE_DEACTIVATING: a disconnection from the current network
 *   connection was requested, and the device is cleaning up resources used for
 *   that connection.  The network connection may still be valid.
 * @NM_DEVICE_STATE_FAILED: the device failed to connect to the requested
 *   network and is cleaning up the connection request
 **/
typedef enum {
    NM_DEVICE_STATE_UNKNOWN      = 0,
    NM_DEVICE_STATE_UNMANAGED    = 10,
    NM_DEVICE_STATE_UNAVAILABLE  = 20,
    NM_DEVICE_STATE_DISCONNECTED = 30,
    NM_DEVICE_STATE_PREPARE      = 40,
    NM_DEVICE_STATE_CONFIG       = 50,
    NM_DEVICE_STATE_NEED_AUTH    = 60,
    NM_DEVICE_STATE_IP_CONFIG    = 70,
    NM_DEVICE_STATE_IP_CHECK     = 80,
    NM_DEVICE_STATE_SECONDARIES  = 90,
    NM_DEVICE_STATE_ACTIVATED    = 100,
    NM_DEVICE_STATE_DEACTIVATING = 110,
    NM_DEVICE_STATE_FAILED       = 120,
} NMDeviceState;

/**
 * NMDeviceStateReason:
 * @NM_DEVICE_STATE_REASON_NONE: No reason given
 * @NM_DEVICE_STATE_REASON_UNKNOWN: Unknown error
 * @NM_DEVICE_STATE_REASON_NOW_MANAGED: Device is now managed
 * @NM_DEVICE_STATE_REASON_NOW_UNMANAGED: Device is now unmanaged
 * @NM_DEVICE_STATE_REASON_CONFIG_FAILED: The device could not be readied for configuration
 * @NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE: IP configuration could not be reserved (no available address, timeout, etc)
 * @NM_DEVICE_STATE_REASON_IP_CONFIG_EXPIRED: The IP config is no longer valid
 * @NM_DEVICE_STATE_REASON_NO_SECRETS: Secrets were required, but not provided
 * @NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT: 802.1x supplicant disconnected
 * @NM_DEVICE_STATE_REASON_SUPPLICANT_CONFIG_FAILED: 802.1x supplicant configuration failed
 * @NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED: 802.1x supplicant failed
 * @NM_DEVICE_STATE_REASON_SUPPLICANT_TIMEOUT: 802.1x supplicant took too long to authenticate
 * @NM_DEVICE_STATE_REASON_PPP_START_FAILED: PPP service failed to start
 * @NM_DEVICE_STATE_REASON_PPP_DISCONNECT: PPP service disconnected
 * @NM_DEVICE_STATE_REASON_PPP_FAILED: PPP failed
 * @NM_DEVICE_STATE_REASON_DHCP_START_FAILED: DHCP client failed to start
 * @NM_DEVICE_STATE_REASON_DHCP_ERROR: DHCP client error
 * @NM_DEVICE_STATE_REASON_DHCP_FAILED: DHCP client failed
 * @NM_DEVICE_STATE_REASON_SHARED_START_FAILED: Shared connection service failed to start
 * @NM_DEVICE_STATE_REASON_SHARED_FAILED: Shared connection service failed
 * @NM_DEVICE_STATE_REASON_AUTOIP_START_FAILED: AutoIP service failed to start
 * @NM_DEVICE_STATE_REASON_AUTOIP_ERROR: AutoIP service error
 * @NM_DEVICE_STATE_REASON_AUTOIP_FAILED: AutoIP service failed
 * @NM_DEVICE_STATE_REASON_MODEM_BUSY: The line is busy
 * @NM_DEVICE_STATE_REASON_MODEM_NO_DIAL_TONE: No dial tone
 * @NM_DEVICE_STATE_REASON_MODEM_NO_CARRIER: No carrier could be established
 * @NM_DEVICE_STATE_REASON_MODEM_DIAL_TIMEOUT: The dialing request timed out
 * @NM_DEVICE_STATE_REASON_MODEM_DIAL_FAILED: The dialing attempt failed
 * @NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED: Modem initialization failed
 * @NM_DEVICE_STATE_REASON_GSM_APN_FAILED: Failed to select the specified APN
 * @NM_DEVICE_STATE_REASON_GSM_REGISTRATION_NOT_SEARCHING: Not searching for networks
 * @NM_DEVICE_STATE_REASON_GSM_REGISTRATION_DENIED: Network registration denied
 * @NM_DEVICE_STATE_REASON_GSM_REGISTRATION_TIMEOUT: Network registration timed out
 * @NM_DEVICE_STATE_REASON_GSM_REGISTRATION_FAILED: Failed to register with the requested network
 * @NM_DEVICE_STATE_REASON_GSM_PIN_CHECK_FAILED: PIN check failed
 * @NM_DEVICE_STATE_REASON_FIRMWARE_MISSING: Necessary firmware for the device may be missing
 * @NM_DEVICE_STATE_REASON_REMOVED: The device was removed
 * @NM_DEVICE_STATE_REASON_SLEEPING: NetworkManager went to sleep
 * @NM_DEVICE_STATE_REASON_CONNECTION_REMOVED: The device's active connection disappeared
 * @NM_DEVICE_STATE_REASON_USER_REQUESTED: Device disconnected by user or client
 * @NM_DEVICE_STATE_REASON_CARRIER: Carrier/link changed
 * @NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED: The device's existing connection was assumed
 * @NM_DEVICE_STATE_REASON_SUPPLICANT_AVAILABLE: The supplicant is now available
 * @NM_DEVICE_STATE_REASON_MODEM_NOT_FOUND: The modem could not be found
 * @NM_DEVICE_STATE_REASON_BT_FAILED: The Bluetooth connection failed or timed out
 * @NM_DEVICE_STATE_REASON_GSM_SIM_NOT_INSERTED: GSM Modem's SIM Card not inserted
 * @NM_DEVICE_STATE_REASON_GSM_SIM_PIN_REQUIRED: GSM Modem's SIM Pin required
 * @NM_DEVICE_STATE_REASON_GSM_SIM_PUK_REQUIRED: GSM Modem's SIM Puk required
 * @NM_DEVICE_STATE_REASON_GSM_SIM_WRONG: GSM Modem's SIM wrong
 * @NM_DEVICE_STATE_REASON_INFINIBAND_MODE: InfiniBand device does not support connected mode
 * @NM_DEVICE_STATE_REASON_DEPENDENCY_FAILED: A dependency of the connection failed
 * @NM_DEVICE_STATE_REASON_BR2684_FAILED: Problem with the RFC 2684 Ethernet over ADSL bridge
 * @NM_DEVICE_STATE_REASON_MODEM_MANAGER_UNAVAILABLE: ModemManager not running
 * @NM_DEVICE_STATE_REASON_SSID_NOT_FOUND: The Wi-Fi network could not be found
 * @NM_DEVICE_STATE_REASON_SECONDARY_CONNECTION_FAILED: A secondary connection of the base connection failed
 * @NM_DEVICE_STATE_REASON_DCB_FCOE_FAILED: DCB or FCoE setup failed
 * @NM_DEVICE_STATE_REASON_TEAMD_CONTROL_FAILED: teamd control failed
 * @NM_DEVICE_STATE_REASON_MODEM_FAILED: Modem failed or no longer available
 * @NM_DEVICE_STATE_REASON_MODEM_AVAILABLE: Modem now ready and available
 * @NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT: SIM PIN was incorrect
 * @NM_DEVICE_STATE_REASON_NEW_ACTIVATION: New connection activation was enqueued
 * @NM_DEVICE_STATE_REASON_PARENT_CHANGED: the device's parent changed
 * @NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED: the device parent's management changed
 * @NM_DEVICE_STATE_REASON_OVSDB_FAILED: problem communicating with Open vSwitch database
 * @NM_DEVICE_STATE_REASON_IP_ADDRESS_DUPLICATE: a duplicate IP address was detected
 * @NM_DEVICE_STATE_REASON_IP_METHOD_UNSUPPORTED: The selected IP method is not supported
 * @NM_DEVICE_STATE_REASON_SRIOV_CONFIGURATION_FAILED: configuration of SR-IOV parameters failed
 * @NM_DEVICE_STATE_REASON_PEER_NOT_FOUND: The Wi-Fi P2P peer could not be found
 * @NM_DEVICE_STATE_REASON_DEVICE_HANDLER_FAILED: The device handler dispatcher returned an
 *   error. Since: 1.46
 *
 * Device state change reason codes
 */
typedef enum {
    NM_DEVICE_STATE_REASON_NONE                           = 0,
    NM_DEVICE_STATE_REASON_UNKNOWN                        = 1,
    NM_DEVICE_STATE_REASON_NOW_MANAGED                    = 2,
    NM_DEVICE_STATE_REASON_NOW_UNMANAGED                  = 3,
    NM_DEVICE_STATE_REASON_CONFIG_FAILED                  = 4,
    NM_DEVICE_STATE_REASON_IP_CONFIG_UNAVAILABLE          = 5,
    NM_DEVICE_STATE_REASON_IP_CONFIG_EXPIRED              = 6,
    NM_DEVICE_STATE_REASON_NO_SECRETS                     = 7,
    NM_DEVICE_STATE_REASON_SUPPLICANT_DISCONNECT          = 8,
    NM_DEVICE_STATE_REASON_SUPPLICANT_CONFIG_FAILED       = 9,
    NM_DEVICE_STATE_REASON_SUPPLICANT_FAILED              = 10,
    NM_DEVICE_STATE_REASON_SUPPLICANT_TIMEOUT             = 11,
    NM_DEVICE_STATE_REASON_PPP_START_FAILED               = 12,
    NM_DEVICE_STATE_REASON_PPP_DISCONNECT                 = 13,
    NM_DEVICE_STATE_REASON_PPP_FAILED                     = 14,
    NM_DEVICE_STATE_REASON_DHCP_START_FAILED              = 15,
    NM_DEVICE_STATE_REASON_DHCP_ERROR                     = 16,
    NM_DEVICE_STATE_REASON_DHCP_FAILED                    = 17,
    NM_DEVICE_STATE_REASON_SHARED_START_FAILED            = 18,
    NM_DEVICE_STATE_REASON_SHARED_FAILED                  = 19,
    NM_DEVICE_STATE_REASON_AUTOIP_START_FAILED            = 20,
    NM_DEVICE_STATE_REASON_AUTOIP_ERROR                   = 21,
    NM_DEVICE_STATE_REASON_AUTOIP_FAILED                  = 22,
    NM_DEVICE_STATE_REASON_MODEM_BUSY                     = 23,
    NM_DEVICE_STATE_REASON_MODEM_NO_DIAL_TONE             = 24,
    NM_DEVICE_STATE_REASON_MODEM_NO_CARRIER               = 25,
    NM_DEVICE_STATE_REASON_MODEM_DIAL_TIMEOUT             = 26,
    NM_DEVICE_STATE_REASON_MODEM_DIAL_FAILED              = 27,
    NM_DEVICE_STATE_REASON_MODEM_INIT_FAILED              = 28,
    NM_DEVICE_STATE_REASON_GSM_APN_FAILED                 = 29,
    NM_DEVICE_STATE_REASON_GSM_REGISTRATION_NOT_SEARCHING = 30,
    NM_DEVICE_STATE_REASON_GSM_REGISTRATION_DENIED        = 31,
    NM_DEVICE_STATE_REASON_GSM_REGISTRATION_TIMEOUT       = 32,
    NM_DEVICE_STATE_REASON_GSM_REGISTRATION_FAILED        = 33,
    NM_DEVICE_STATE_REASON_GSM_PIN_CHECK_FAILED           = 34,
    NM_DEVICE_STATE_REASON_FIRMWARE_MISSING               = 35,
    NM_DEVICE_STATE_REASON_REMOVED                        = 36,
    NM_DEVICE_STATE_REASON_SLEEPING                       = 37,
    NM_DEVICE_STATE_REASON_CONNECTION_REMOVED             = 38,
    NM_DEVICE_STATE_REASON_USER_REQUESTED                 = 39,
    NM_DEVICE_STATE_REASON_CARRIER                        = 40,
    NM_DEVICE_STATE_REASON_CONNECTION_ASSUMED             = 41,
    NM_DEVICE_STATE_REASON_SUPPLICANT_AVAILABLE           = 42,
    NM_DEVICE_STATE_REASON_MODEM_NOT_FOUND                = 43,
    NM_DEVICE_STATE_REASON_BT_FAILED                      = 44,
    NM_DEVICE_STATE_REASON_GSM_SIM_NOT_INSERTED           = 45,
    NM_DEVICE_STATE_REASON_GSM_SIM_PIN_REQUIRED           = 46,
    NM_DEVICE_STATE_REASON_GSM_SIM_PUK_REQUIRED           = 47,
    NM_DEVICE_STATE_REASON_GSM_SIM_WRONG                  = 48,
    NM_DEVICE_STATE_REASON_INFINIBAND_MODE                = 49,
    NM_DEVICE_STATE_REASON_DEPENDENCY_FAILED              = 50,
    NM_DEVICE_STATE_REASON_BR2684_FAILED                  = 51,
    NM_DEVICE_STATE_REASON_MODEM_MANAGER_UNAVAILABLE      = 52,
    NM_DEVICE_STATE_REASON_SSID_NOT_FOUND                 = 53,
    NM_DEVICE_STATE_REASON_SECONDARY_CONNECTION_FAILED    = 54,
    NM_DEVICE_STATE_REASON_DCB_FCOE_FAILED                = 55,
    NM_DEVICE_STATE_REASON_TEAMD_CONTROL_FAILED           = 56,
    NM_DEVICE_STATE_REASON_MODEM_FAILED                   = 57,
    NM_DEVICE_STATE_REASON_MODEM_AVAILABLE                = 58,
    NM_DEVICE_STATE_REASON_SIM_PIN_INCORRECT              = 59,
    NM_DEVICE_STATE_REASON_NEW_ACTIVATION                 = 60,
    NM_DEVICE_STATE_REASON_PARENT_CHANGED                 = 61,
    NM_DEVICE_STATE_REASON_PARENT_MANAGED_CHANGED         = 62,
    NM_DEVICE_STATE_REASON_OVSDB_FAILED                   = 63,
    NM_DEVICE_STATE_REASON_IP_ADDRESS_DUPLICATE           = 64,
    NM_DEVICE_STATE_REASON_IP_METHOD_UNSUPPORTED          = 65,
    NM_DEVICE_STATE_REASON_SRIOV_CONFIGURATION_FAILED     = 66,
    NM_DEVICE_STATE_REASON_PEER_NOT_FOUND                 = 67,
    NM_DEVICE_STATE_REASON_DEVICE_HANDLER_FAILED          = 68,
} NMDeviceStateReason;

/**
 * NMMetered:
 * @NM_METERED_UNKNOWN:     The metered status is unknown
 * @NM_METERED_YES:         Metered, the value was explicitly configured
 * @NM_METERED_NO:          Not metered, the value was explicitly configured
 * @NM_METERED_GUESS_YES:   Metered, the value was guessed
 * @NM_METERED_GUESS_NO:    Not metered, the value was guessed
 *
 * The NMMetered enum has two different purposes: one is to configure
 * "connection.metered" setting of a connection profile in #NMSettingConnection, and
 * the other is to express the actual metered state of the #NMDevice at a given moment.
 *
 * For the connection profile only #NM_METERED_UNKNOWN, #NM_METERED_NO
 * and #NM_METERED_YES are allowed.
 *
 * The device's metered state at runtime is determined by the profile
 * which is currently active. If the profile explicitly specifies #NM_METERED_NO
 * or #NM_METERED_YES, then the device's metered state is as such.
 * If the connection profile leaves it undecided at #NM_METERED_UNKNOWN (the default),
 * then NetworkManager tries to guess the metered state, for example based on the
 * device type or on DHCP options (like Android devices exposing a "ANDROID_METERED"
 * DHCP vendor option). This then leads to either #NM_METERED_GUESS_NO or #NM_METERED_GUESS_YES.
 *
 * Most applications probably should treat the runtime state #NM_METERED_GUESS_YES
 * like #NM_METERED_YES, and all other states as not metered.
 *
 * Note that the per-device metered states are then combined to a global metered
 * state. This is basically the metered state of the device with the best default
 * route. However, that generalization of a global metered state may not be correct
 * if the default routes for IPv4 and IPv6 are on different devices, or if policy
 * routing is configured. In general, the global metered state tries to express whether
 * the traffic is likely metered, but since that depends on the traffic itself,
 * there is not one answer in all cases. Hence, an application may want to consider
 * the per-device's metered states.
 *
 * Since: 1.2
 **/
NM_AVAILABLE_IN_1_2
typedef enum {
    NM_METERED_UNKNOWN   = 0,
    NM_METERED_YES       = 1,
    NM_METERED_NO        = 2,
    NM_METERED_GUESS_YES = 3,
    NM_METERED_GUESS_NO  = 4,
} NMMetered;

/**
 * NMConnectionMultiConnect:
 * @NM_CONNECTION_MULTI_CONNECT_DEFAULT: indicates that the per-connection
 *   setting is unspecified. In this case, it will fallback to the default
 *   value, which is %NM_CONNECTION_MULTI_CONNECT_SINGLE.
 * @NM_CONNECTION_MULTI_CONNECT_SINGLE: the connection profile can only
 *   be active once at each moment. Activating a profile that is already active,
 *   will first deactivate it.
 * @NM_CONNECTION_MULTI_CONNECT_MANUAL_MULTIPLE: the profile can
 *   be manually activated multiple times on different devices. However,
 *   regarding autoconnect, the profile will autoconnect only if it is
 *   currently not connected otherwise.
 * @NM_CONNECTION_MULTI_CONNECT_MULTIPLE: the profile can autoactivate
 *   and be manually activated multiple times together.
 *
 * Since: 1.14
 */
typedef enum {
    NM_CONNECTION_MULTI_CONNECT_DEFAULT         = 0,
    NM_CONNECTION_MULTI_CONNECT_SINGLE          = 1,
    NM_CONNECTION_MULTI_CONNECT_MANUAL_MULTIPLE = 2,
    NM_CONNECTION_MULTI_CONNECT_MULTIPLE        = 3,
} NMConnectionMultiConnect;

/**
 * NMActiveConnectionState:
 * @NM_ACTIVE_CONNECTION_STATE_UNKNOWN: the state of the connection is unknown
 * @NM_ACTIVE_CONNECTION_STATE_ACTIVATING: a network connection is being prepared
 * @NM_ACTIVE_CONNECTION_STATE_ACTIVATED: there is a connection to the network
 * @NM_ACTIVE_CONNECTION_STATE_DEACTIVATING: the network connection is being
 *   torn down and cleaned up
 * @NM_ACTIVE_CONNECTION_STATE_DEACTIVATED: the network connection is disconnected
 *   and will be removed
 *
 * #NMActiveConnectionState values indicate the state of a connection to a
 * specific network while it is starting, connected, or disconnecting from that
 * network.
 **/
typedef enum {
    NM_ACTIVE_CONNECTION_STATE_UNKNOWN      = 0,
    NM_ACTIVE_CONNECTION_STATE_ACTIVATING   = 1,
    NM_ACTIVE_CONNECTION_STATE_ACTIVATED    = 2,
    NM_ACTIVE_CONNECTION_STATE_DEACTIVATING = 3,
    NM_ACTIVE_CONNECTION_STATE_DEACTIVATED  = 4,
} NMActiveConnectionState;

/**
 * NMActiveConnectionStateReason:
 * @NM_ACTIVE_CONNECTION_STATE_REASON_UNKNOWN: The reason for the active connection
 *   state change is unknown.
 * @NM_ACTIVE_CONNECTION_STATE_REASON_NONE: No reason was given for the active
 *   connection state change.
 * @NM_ACTIVE_CONNECTION_STATE_REASON_USER_DISCONNECTED: The active connection changed
 *   state because the user disconnected it.
 * @NM_ACTIVE_CONNECTION_STATE_REASON_DEVICE_DISCONNECTED: The active connection
 *   changed state because the device it was using was disconnected.
 * @NM_ACTIVE_CONNECTION_STATE_REASON_SERVICE_STOPPED: The service providing the
 *   VPN connection was stopped.
 * @NM_ACTIVE_CONNECTION_STATE_REASON_IP_CONFIG_INVALID: The IP config of the active
 *   connection was invalid.
 * @NM_ACTIVE_CONNECTION_STATE_REASON_CONNECT_TIMEOUT: The connection attempt to
 *   the VPN service timed out.
 * @NM_ACTIVE_CONNECTION_STATE_REASON_SERVICE_START_TIMEOUT: A timeout occurred
 *   while starting the service providing the VPN connection.
 * @NM_ACTIVE_CONNECTION_STATE_REASON_SERVICE_START_FAILED: Starting the service
 *   providing the VPN connection failed.
 * @NM_ACTIVE_CONNECTION_STATE_REASON_NO_SECRETS: Necessary secrets for the
 *   connection were not provided.
 * @NM_ACTIVE_CONNECTION_STATE_REASON_LOGIN_FAILED: Authentication to the
 *   server failed.
 * @NM_ACTIVE_CONNECTION_STATE_REASON_CONNECTION_REMOVED: The connection was
 *   deleted from settings.
 * @NM_ACTIVE_CONNECTION_STATE_REASON_DEPENDENCY_FAILED: Master connection of this
 *   connection failed to activate.
 * @NM_ACTIVE_CONNECTION_STATE_REASON_DEVICE_REALIZE_FAILED: Could not create the
 *   software device link.
 * @NM_ACTIVE_CONNECTION_STATE_REASON_DEVICE_REMOVED: The device this connection
 *   depended on disappeared.
 *
 * Active connection state reasons.
 *
 * Since: 1.8
 */
NM_AVAILABLE_IN_1_8
typedef enum {
    NM_ACTIVE_CONNECTION_STATE_REASON_UNKNOWN               = 0,
    NM_ACTIVE_CONNECTION_STATE_REASON_NONE                  = 1,
    NM_ACTIVE_CONNECTION_STATE_REASON_USER_DISCONNECTED     = 2,
    NM_ACTIVE_CONNECTION_STATE_REASON_DEVICE_DISCONNECTED   = 3,
    NM_ACTIVE_CONNECTION_STATE_REASON_SERVICE_STOPPED       = 4,
    NM_ACTIVE_CONNECTION_STATE_REASON_IP_CONFIG_INVALID     = 5,
    NM_ACTIVE_CONNECTION_STATE_REASON_CONNECT_TIMEOUT       = 6,
    NM_ACTIVE_CONNECTION_STATE_REASON_SERVICE_START_TIMEOUT = 7,
    NM_ACTIVE_CONNECTION_STATE_REASON_SERVICE_START_FAILED  = 8,
    NM_ACTIVE_CONNECTION_STATE_REASON_NO_SECRETS            = 9,
    NM_ACTIVE_CONNECTION_STATE_REASON_LOGIN_FAILED          = 10,
    NM_ACTIVE_CONNECTION_STATE_REASON_CONNECTION_REMOVED    = 11,
    NM_ACTIVE_CONNECTION_STATE_REASON_DEPENDENCY_FAILED     = 12,
    NM_ACTIVE_CONNECTION_STATE_REASON_DEVICE_REALIZE_FAILED = 13,
    NM_ACTIVE_CONNECTION_STATE_REASON_DEVICE_REMOVED        = 14,
} NMActiveConnectionStateReason;

/**
 * NMSecretAgentGetSecretsFlags:
 * @NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE: no special behavior; by default no
 *   user interaction is allowed and requests for secrets are fulfilled from
 *   persistent storage, or if no secrets are available an error is returned.
 * @NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION: allows the request to
 *   interact with the user, possibly prompting via UI for secrets if any are
 *   required, or if none are found in persistent storage.
 * @NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW: explicitly prompt for new
 *   secrets from the user.  This flag signals that NetworkManager thinks any
 *   existing secrets are invalid or wrong.  This flag implies that interaction
 *   is allowed.
 * @NM_SECRET_AGENT_GET_SECRETS_FLAG_USER_REQUESTED: set if the request was
 *   initiated by user-requested action via the D-Bus interface, as opposed to
 *   automatically initiated by NetworkManager in response to (for example) scan
 *   results or carrier changes.
 * @NM_SECRET_AGENT_GET_SECRETS_FLAG_WPS_PBC_ACTIVE: indicates that WPS enrollment
 *   is active with PBC method. The agent may suggest that the user pushes a button
 *   on the router instead of supplying a PSK.
 * @NM_SECRET_AGENT_GET_SECRETS_FLAG_ONLY_SYSTEM: Internal flag, not part of
 *   the D-Bus API.
 * @NM_SECRET_AGENT_GET_SECRETS_FLAG_NO_ERRORS: Internal flag, not part of
 *   the D-Bus API.
 *
 * #NMSecretAgentGetSecretsFlags values modify the behavior of a GetSecrets request.
 */
typedef enum /*< flags >*/ {
    NM_SECRET_AGENT_GET_SECRETS_FLAG_NONE              = 0x0,
    NM_SECRET_AGENT_GET_SECRETS_FLAG_ALLOW_INTERACTION = 0x1,
    NM_SECRET_AGENT_GET_SECRETS_FLAG_REQUEST_NEW       = 0x2,
    NM_SECRET_AGENT_GET_SECRETS_FLAG_USER_REQUESTED    = 0x4,
    NM_SECRET_AGENT_GET_SECRETS_FLAG_WPS_PBC_ACTIVE    = 0x8,

    /* Internal to NM; not part of the D-Bus API */
    NM_SECRET_AGENT_GET_SECRETS_FLAG_ONLY_SYSTEM = 0x80000000,
    NM_SECRET_AGENT_GET_SECRETS_FLAG_NO_ERRORS   = 0x40000000,
} NMSecretAgentGetSecretsFlags;

/**
 * NMSecretAgentCapabilities:
 * @NM_SECRET_AGENT_CAPABILITY_NONE: the agent supports no special capabilities
 * @NM_SECRET_AGENT_CAPABILITY_VPN_HINTS: the agent supports passing hints to
 * VPN plugin authentication dialogs.
 * @NM_SECRET_AGENT_CAPABILITY_LAST: bounds checking value; should not be used.
 *
 * #NMSecretAgentCapabilities indicate various capabilities of the agent.
 */
typedef enum /*< flags >*/ {
    NM_SECRET_AGENT_CAPABILITY_NONE      = 0x0,
    NM_SECRET_AGENT_CAPABILITY_VPN_HINTS = 0x1,

    /* boundary value */
    NM_SECRET_AGENT_CAPABILITY_LAST = NM_SECRET_AGENT_CAPABILITY_VPN_HINTS,
} NMSecretAgentCapabilities;

#ifndef NM_VERSION_H
#undef NM_AVAILABLE_IN_1_2
#undef NM_AVAILABLE_IN_1_8
#endif

#define NM_LLDP_ATTR_RAW                  "raw"
#define NM_LLDP_ATTR_DESTINATION          "destination"
#define NM_LLDP_ATTR_CHASSIS_ID_TYPE      "chassis-id-type"
#define NM_LLDP_ATTR_CHASSIS_ID           "chassis-id"
#define NM_LLDP_ATTR_PORT_ID_TYPE         "port-id-type"
#define NM_LLDP_ATTR_PORT_ID              "port-id"
#define NM_LLDP_ATTR_PORT_DESCRIPTION     "port-description"
#define NM_LLDP_ATTR_SYSTEM_NAME          "system-name"
#define NM_LLDP_ATTR_SYSTEM_DESCRIPTION   "system-description"
#define NM_LLDP_ATTR_SYSTEM_CAPABILITIES  "system-capabilities"
#define NM_LLDP_ATTR_MANAGEMENT_ADDRESSES "management-addresses"

#define NM_LLDP_ATTR_IEEE_802_1_PVID   "ieee-802-1-pvid"
#define NM_LLDP_ATTR_IEEE_802_1_VLANS  "ieee-802-1-vlans"
#define NM_LLDP_ATTR_IEEE_802_1_PPVIDS "ieee-802-1-ppvids"

#define NM_LLDP_ATTR_IEEE_802_3_MAC_PHY_CONF   "ieee-802-3-mac-phy-conf"
#define NM_LLDP_ATTR_IEEE_802_3_POWER_VIA_MDI  "ieee-802-3-power-via-mdi"
#define NM_LLDP_ATTR_IEEE_802_3_MAX_FRAME_SIZE "ieee-802-3-max-frame-size"

#define NM_LLDP_ATTR_MUD_URL "mud-url"

/* These are deprecated in favor of NM_LLDP_ATTR_IEEE_802_1_VLANS,
 * which can report multiple VLANs */
#define NM_LLDP_ATTR_IEEE_802_1_VID       "ieee-802-1-vid"
#define NM_LLDP_ATTR_IEEE_802_1_VLAN_NAME "ieee-802-1-vlan-name"

/* These are deprecated in favor of NM_LLDP_ATTR_IEEE_802_1_PPVIDS,
 * which can report multiple PPVIDs */
#define NM_LLDP_ATTR_IEEE_802_1_PPVID       "ieee-802-1-ppvid"
#define NM_LLDP_ATTR_IEEE_802_1_PPVID_FLAGS "ieee-802-1-ppvid-flags"

#define NM_LLDP_DEST_NEAREST_BRIDGE          "nearest-bridge"
#define NM_LLDP_DEST_NEAREST_NON_TPMR_BRIDGE "nearest-non-tpmr-bridge"
#define NM_LLDP_DEST_NEAREST_CUSTOMER_BRIDGE "nearest-customer-bridge"

/**
 * NMIPTunnelMode:
 * @NM_IP_TUNNEL_MODE_UNKNOWN:   Unknown/unset tunnel mode
 * @NM_IP_TUNNEL_MODE_IPIP:      IP in IP tunnel
 * @NM_IP_TUNNEL_MODE_GRE:       GRE tunnel
 * @NM_IP_TUNNEL_MODE_SIT:       SIT tunnel
 * @NM_IP_TUNNEL_MODE_ISATAP:    ISATAP tunnel
 * @NM_IP_TUNNEL_MODE_VTI:       VTI tunnel
 * @NM_IP_TUNNEL_MODE_IP6IP6:    IPv6 in IPv6 tunnel
 * @NM_IP_TUNNEL_MODE_IPIP6:     IPv4 in IPv6 tunnel
 * @NM_IP_TUNNEL_MODE_IP6GRE:    IPv6 GRE tunnel
 * @NM_IP_TUNNEL_MODE_VTI6:      IPv6 VTI tunnel
 * @NM_IP_TUNNEL_MODE_GRETAP:    GRETAP tunnel
 * @NM_IP_TUNNEL_MODE_IP6GRETAP: IPv6 GRETAP tunnel
 *
 * The tunneling mode.
 *
 * Since: 1.2
 */
typedef enum {
    NM_IP_TUNNEL_MODE_UNKNOWN   = 0,
    NM_IP_TUNNEL_MODE_IPIP      = 1,
    NM_IP_TUNNEL_MODE_GRE       = 2,
    NM_IP_TUNNEL_MODE_SIT       = 3,
    NM_IP_TUNNEL_MODE_ISATAP    = 4,
    NM_IP_TUNNEL_MODE_VTI       = 5,
    NM_IP_TUNNEL_MODE_IP6IP6    = 6,
    NM_IP_TUNNEL_MODE_IPIP6     = 7,
    NM_IP_TUNNEL_MODE_IP6GRE    = 8,
    NM_IP_TUNNEL_MODE_VTI6      = 9,
    NM_IP_TUNNEL_MODE_GRETAP    = 10,
    NM_IP_TUNNEL_MODE_IP6GRETAP = 11,
} NMIPTunnelMode;

/**
 * NMCheckpointCreateFlags:
 * @NM_CHECKPOINT_CREATE_FLAG_NONE: no flags
 * @NM_CHECKPOINT_CREATE_FLAG_DESTROY_ALL: when creating
 *   a new checkpoint, destroy all existing ones.
 * @NM_CHECKPOINT_CREATE_FLAG_DELETE_NEW_CONNECTIONS: upon rollback,
 *   delete any new connection added after the checkpoint. Since: 1.6.
 * @NM_CHECKPOINT_CREATE_FLAG_DISCONNECT_NEW_DEVICES: upon rollback,
 *   disconnect any new device appeared after the checkpoint. Since: 1.6.
 * @NM_CHECKPOINT_CREATE_FLAG_ALLOW_OVERLAPPING: by default, creating
 *   a checkpoint fails if there are already existing checkpoints that
 *   reference the same devices. With this flag, creation of such
 *   checkpoints is allowed, however, if an older checkpoint
 *   that references overlapping devices gets rolled back, it will
 *   automatically destroy this checkpoint during rollback. This
 *   allows to create several overlapping checkpoints in parallel,
 *   and rollback to them at will. With the special case that
 *   rolling back to an older checkpoint will invalidate all
 *   overlapping younger checkpoints. This opts-in that the
 *   checkpoint can be automatically destroyed by the rollback
 *   of an older checkpoint. Since: 1.12.
 * @NM_CHECKPOINT_CREATE_FLAG_NO_PRESERVE_EXTERNAL_PORTS: during rollback,
 *   by default externally added ports attached to bridge devices are preserved.
 *   With this flag, the rollback detaches all external ports.
 *   This only has an effect for bridge ports. Before 1.38, this was the default
 *   behavior. Since: 1.38.
 *
 * The flags for CheckpointCreate call
 *
 * Since: 1.12: Public since 1.4, g-ir since 1.12.
 */
typedef enum /*< flags >*/ {
    NM_CHECKPOINT_CREATE_FLAG_NONE                       = 0,
    NM_CHECKPOINT_CREATE_FLAG_DESTROY_ALL                = 0x01,
    NM_CHECKPOINT_CREATE_FLAG_DELETE_NEW_CONNECTIONS     = 0x02,
    NM_CHECKPOINT_CREATE_FLAG_DISCONNECT_NEW_DEVICES     = 0x04,
    NM_CHECKPOINT_CREATE_FLAG_ALLOW_OVERLAPPING          = 0x08,
    NM_CHECKPOINT_CREATE_FLAG_NO_PRESERVE_EXTERNAL_PORTS = 0x10,
} NMCheckpointCreateFlags;

/**
 * NMRollbackResult:
 * @NM_ROLLBACK_RESULT_OK: the rollback succeeded.
 * @NM_ROLLBACK_RESULT_ERR_NO_DEVICE: the device no longer exists.
 * @NM_ROLLBACK_RESULT_ERR_DEVICE_UNMANAGED: the device is now unmanaged.
 * @NM_ROLLBACK_RESULT_ERR_FAILED: other errors during rollback.
 *
 * The result of a checkpoint Rollback() operation for a specific device.
 *
 * Since: 1.4
 **/
typedef enum /*< skip >*/ {
    NM_ROLLBACK_RESULT_OK                   = 0,
    NM_ROLLBACK_RESULT_ERR_NO_DEVICE        = 1,
    NM_ROLLBACK_RESULT_ERR_DEVICE_UNMANAGED = 2,
    NM_ROLLBACK_RESULT_ERR_FAILED           = 3,
} NMRollbackResult;

/**
 * NMSettingsConnectionFlags:
 * @NM_SETTINGS_CONNECTION_FLAG_NONE: an alias for numeric zero, no flags set.
 * @NM_SETTINGS_CONNECTION_FLAG_UNSAVED: the connection is not saved to disk.
 *   That either means, that the connection is in-memory only and currently
 *   is not backed by a file. Or, that the connection is backed by a file,
 *   but has modifications in-memory that were not persisted to disk.
 * @NM_SETTINGS_CONNECTION_FLAG_NM_GENERATED: A connection is "nm-generated" if
 *  it was generated by NetworkManger. If the connection gets modified or saved
 *  by the user, the flag gets cleared. A nm-generated is also unsaved
 *  and has no backing file as it is in-memory only.
 * @NM_SETTINGS_CONNECTION_FLAG_VOLATILE: The connection will be deleted
 *  when it disconnects. That is for in-memory connections (unsaved), which are
 *  currently active but deleted on disconnect. Volatile connections are
 *  always unsaved, but they are also no backing file on disk and are entirely
 *  in-memory only.
 * @NM_SETTINGS_CONNECTION_FLAG_EXTERNAL: the profile was generated to represent
 *  an external configuration of a networking device. Since: 1.26.
 *
 * Flags describing the current activation state.
 *
 * Since: 1.12
 **/
typedef enum /*< flags >*/ {
    NM_SETTINGS_CONNECTION_FLAG_NONE         = 0,
    NM_SETTINGS_CONNECTION_FLAG_UNSAVED      = 0x01,
    NM_SETTINGS_CONNECTION_FLAG_NM_GENERATED = 0x02,
    NM_SETTINGS_CONNECTION_FLAG_VOLATILE     = 0x04,
    NM_SETTINGS_CONNECTION_FLAG_EXTERNAL     = 0x08,
} NMSettingsConnectionFlags;

/**
 * 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.
 * @NM_ACTIVATION_STATE_FLAG_LIFETIME_BOUND_TO_PROFILE_VISIBILITY: the lifetime
 *   of the activation is bound to the visibility of the connection profile,
 *   which in turn depends on "connection.permissions" and whether a session
 *   for the user exists. Since: 1.16.
 * @NM_ACTIVATION_STATE_FLAG_EXTERNAL: the active connection was generated to
 *  represent an external configuration of a networking device. Since: 1.26.
 *
 * Flags describing the current activation state.
 *
 * Since: 1.10
 **/
typedef enum /*< flags >*/ {
    NM_ACTIVATION_STATE_FLAG_NONE = 0,

    NM_ACTIVATION_STATE_FLAG_IS_MASTER                            = 0x1,
    NM_ACTIVATION_STATE_FLAG_IS_SLAVE                             = 0x2,
    NM_ACTIVATION_STATE_FLAG_LAYER2_READY                         = 0x4,
    NM_ACTIVATION_STATE_FLAG_IP4_READY                            = 0x8,
    NM_ACTIVATION_STATE_FLAG_IP6_READY                            = 0x10,
    NM_ACTIVATION_STATE_FLAG_MASTER_HAS_SLAVES                    = 0x20,
    NM_ACTIVATION_STATE_FLAG_LIFETIME_BOUND_TO_PROFILE_VISIBILITY = 0x40,
    NM_ACTIVATION_STATE_FLAG_EXTERNAL                             = 0x80,
} NMActivationStateFlags;

/**
 * NMSettingsAddConnection2Flags:
 * @NM_SETTINGS_ADD_CONNECTION2_FLAG_NONE: an alias for numeric zero, no flags set.
 * @NM_SETTINGS_ADD_CONNECTION2_FLAG_TO_DISK: to persist the connection to disk.
 * @NM_SETTINGS_ADD_CONNECTION2_FLAG_IN_MEMORY: to make the connection in-memory only.
 * @NM_SETTINGS_ADD_CONNECTION2_FLAG_BLOCK_AUTOCONNECT: usually, when the connection
 *   has autoconnect enabled and gets added, it becomes eligible to autoconnect
 *   right away. Setting this flag, disables autoconnect until the connection
 *   is manually activated.
 *
 * Numeric flags for the "flags" argument of AddConnection2() D-Bus API.
 *
 * Since: 1.20
 */
typedef enum /*< flags >*/ {
    NM_SETTINGS_ADD_CONNECTION2_FLAG_NONE              = 0,
    NM_SETTINGS_ADD_CONNECTION2_FLAG_TO_DISK           = 0x1,
    NM_SETTINGS_ADD_CONNECTION2_FLAG_IN_MEMORY         = 0x2,
    NM_SETTINGS_ADD_CONNECTION2_FLAG_BLOCK_AUTOCONNECT = 0x20,
} NMSettingsAddConnection2Flags;

/**
 * NMSettingsUpdate2Flags:
 * @NM_SETTINGS_UPDATE2_FLAG_NONE: an alias for numeric zero, no flags set.
 * @NM_SETTINGS_UPDATE2_FLAG_TO_DISK: to persist the connection to disk.
 * @NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY: makes the profile in-memory.
 *   Note that such profiles are stored in keyfile format under /run.
 *   If the file is already in-memory, the file in /run is updated in-place.
 *   Otherwise, the previous storage for the profile is left unchanged
 *   on disk, and the in-memory copy shadows it.
 *   Note that the original filename of the previous persistent storage (if any)
 *   is remembered. That means, when later persisting the profile again to disk,
 *   the file on disk will be overwritten again.
 *   Likewise, when finally deleting the profile, both the storage from /run
 *   and persistent storage are deleted (or if the persistent storage does not
 *   allow deletion, and nmmeta file is written to mark the UUID as deleted).
 * @NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY_DETACHED: this is almost the same
 *   as %NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY, with one difference: when later deleting
 *   the profile, the original profile will not be deleted. Instead a nmmeta
 *   file is written to /run to indicate that the profile is gone.
 *   Note that if such a nmmeta tombstone file exists and hides a file in persistent
 *   storage, then when re-adding the profile with the same UUID, then the original
 *   storage is taken over again.
 * @NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY_ONLY: this is like %NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY,
 *   but if the connection has a corresponding file on persistent storage, the file
 *   will be deleted right away. If the profile is later again persisted to disk,
 *   a new, unused filename will be chosen.
 * @NM_SETTINGS_UPDATE2_FLAG_VOLATILE: This can be specified with either
 *   %NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY, %NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY_DETACHED
 *   or %NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY_ONLY.
 *   After making the connection in-memory only, the connection is marked
 *   as volatile. That means, if the connection is currently not active
 *   it will be deleted right away. Otherwise, it is marked to for deletion
 *   once the connection deactivates. A volatile connection cannot autoactivate
 *   again (because it's about to be deleted), but a manual activation will
 *   clear the volatile flag.
 * @NM_SETTINGS_UPDATE2_FLAG_BLOCK_AUTOCONNECT: usually, when the connection
 *   has autoconnect enabled and is modified, it becomes eligible to autoconnect
 *   right away. Setting this flag, disables autoconnect until the connection
 *   is manually activated.
 * @NM_SETTINGS_UPDATE2_FLAG_NO_REAPPLY: when a profile gets modified that is
 *   currently active, then these changes don't take effect for the active
 *   device unless the profile gets reactivated or the configuration reapplied.
 *   There are two exceptions: by default "connection.zone" and "connection.metered"
 *   properties take effect immediately. Specify this flag to prevent these
 *   properties to take effect, so that the change is restricted to modify
 *   the profile. Since: 1.20.
 *
 * Since: 1.12
 */
typedef enum /*< flags >*/ {
    NM_SETTINGS_UPDATE2_FLAG_NONE               = 0,
    NM_SETTINGS_UPDATE2_FLAG_TO_DISK            = 0x1,
    NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY          = 0x2,
    NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY_DETACHED = 0x4,
    NM_SETTINGS_UPDATE2_FLAG_IN_MEMORY_ONLY     = 0x8,
    NM_SETTINGS_UPDATE2_FLAG_VOLATILE           = 0x10,
    NM_SETTINGS_UPDATE2_FLAG_BLOCK_AUTOCONNECT  = 0x20,
    NM_SETTINGS_UPDATE2_FLAG_NO_REAPPLY         = 0x40,
} NMSettingsUpdate2Flags;

/**
 * NMDeviceReapplyFlags:
 * @NM_DEVICE_REAPPLY_FLAGS_NONE: no flag set.
 * @NM_DEVICE_REAPPLY_FLAGS_PRESERVE_EXTERNAL_IP: during reapply,
 *   preserve external IP addresses and routes.
 *
 * Flags for the Reapply() D-Bus call of a device and
 * nm_device_reapply_async().
 *
 * Since: 1.42
 */
typedef enum /*< flags >*/ {
    NM_DEVICE_REAPPLY_FLAGS_NONE                 = 0,
    NM_DEVICE_REAPPLY_FLAGS_PRESERVE_EXTERNAL_IP = 0x1,
} NMDeviceReapplyFlags;

/**
 * NMTernary:
 * @NM_TERNARY_DEFAULT: use the globally-configured default value.
 * @NM_TERNARY_FALSE: the option is disabled.
 * @NM_TERNARY_TRUE: the option is enabled.
 *
 * An boolean value that can be overridden by a default.
 *
 * Since: 1.14
 **/
typedef enum {
    NM_TERNARY_DEFAULT = -1,
    NM_TERNARY_FALSE   = 0,
    NM_TERNARY_TRUE    = 1,
} NMTernary;

/**
 * NMManagerReloadFlags:
 * @NM_MANAGER_RELOAD_FLAG_NONE: an alias for numeric zero, no flags set. This
 *   reloads everything that is supported and is identical to a SIGHUP.
 * @NM_MANAGER_RELOAD_FLAG_CONF: reload the NetworkManager.conf configuration
 *   from disk. Note that this does not include connections, which can be
 *   reloaded via Setting's ReloadConnections().
 * @NM_MANAGER_RELOAD_FLAG_DNS_RC: update DNS configuration, which usually
 *   involves writing /etc/resolv.conf anew.
 * @NM_MANAGER_RELOAD_FLAG_DNS_FULL: means to restart the DNS plugin. This
 *   is for example useful when using dnsmasq plugin, which uses additional
 *   configuration in /etc/NetworkManager/dnsmasq.d. If you edit those files,
 *   you can restart the DNS plugin. This action shortly interrupts name
 *   resolution.
 * @NM_MANAGER_RELOAD_FLAG_ALL: all flags.
 *
 * Flags for the manager Reload() call.
 *
 * Since: 1.22
 */
typedef enum /*< flags >*/ {
    NM_MANAGER_RELOAD_FLAG_NONE     = 0, /*< skip >*/
    NM_MANAGER_RELOAD_FLAG_CONF     = 0x1,
    NM_MANAGER_RELOAD_FLAG_DNS_RC   = 0x2,
    NM_MANAGER_RELOAD_FLAG_DNS_FULL = 0x4,
    NM_MANAGER_RELOAD_FLAG_ALL      = 0x7, /*< skip >*/
} NMManagerReloadFlags;

/**
 * NMDeviceInterfaceFlags:
 * @NM_DEVICE_INTERFACE_FLAG_NONE: an alias for numeric zero, no flags set.
 * @NM_DEVICE_INTERFACE_FLAG_UP: the interface is enabled from the
 *   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_PROMISC: receive all packets. Corresponds to
 *   kernel IFF_PROMISC. Since: 1.32.
 * @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.
 * @NM_DEVICE_INTERFACE_FLAG_LLDP_CLIENT_ENABLED: the flag to indicate device
 *   LLDP status. Since: 1.32.
 *
 * Flags for a network interface.
 *
 * Since: 1.22
 */
typedef enum /*< flags >*/ {
    /* kernel flags */
    NM_DEVICE_INTERFACE_FLAG_NONE     = 0, /*< skip >*/
    NM_DEVICE_INTERFACE_FLAG_UP       = 0x1,
    NM_DEVICE_INTERFACE_FLAG_LOWER_UP = 0x2,
    NM_DEVICE_INTERFACE_FLAG_PROMISC  = 0x4,
    /* NM-specific flags */
    NM_DEVICE_INTERFACE_FLAG_CARRIER             = 0x10000,
    NM_DEVICE_INTERFACE_FLAG_LLDP_CLIENT_ENABLED = 0x20000,
} NMDeviceInterfaceFlags;

/**
 * NMClientPermission:
 * @NM_CLIENT_PERMISSION_NONE: unknown or no permission
 * @NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK: controls whether networking
 *  can be globally enabled or disabled
 * @NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI: controls whether Wi-Fi can be
 *  globally enabled or disabled
 * @NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN: controls whether WWAN (3G) can be
 *  globally enabled or disabled
 * @NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX: controls whether WiMAX can be
 *  globally enabled or disabled
 * @NM_CLIENT_PERMISSION_SLEEP_WAKE: controls whether the client can ask
 *  NetworkManager to sleep and wake
 * @NM_CLIENT_PERMISSION_NETWORK_CONTROL: controls whether networking connections
 *  can be started, stopped, and changed
 * @NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED: controls whether a password
 *  protected Wi-Fi hotspot can be created
 * @NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN: controls whether an open Wi-Fi hotspot
 *  can be created
 * @NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM: controls whether connections
 *  that are available to all users can be modified
 * @NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN: controls whether connections
 *  owned by the current user can be modified
 * @NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME: controls whether the
 *  persistent hostname can be changed
 * @NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS: modify persistent global
 *  DNS configuration
 * @NM_CLIENT_PERMISSION_RELOAD: controls access to Reload.
 * @NM_CLIENT_PERMISSION_CHECKPOINT_ROLLBACK: permission to create checkpoints.
 * @NM_CLIENT_PERMISSION_ENABLE_DISABLE_STATISTICS: controls whether device
 *  statistics can be globally enabled or disabled
 * @NM_CLIENT_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK: controls whether
 *  connectivity check can be enabled or disabled
 * @NM_CLIENT_PERMISSION_WIFI_SCAN: controls whether wifi scans can be performed
 * @NM_CLIENT_PERMISSION_CONNECTIVITY_SPARE_CHECK: controls connectivity spare
 *  check
 * @NM_CLIENT_PERMISSION_LAST: a reserved boundary value
 *
 * #NMClientPermission values indicate various permissions that NetworkManager
 * clients can obtain to perform certain tasks on behalf of the current user.
 **/
typedef enum {
    NM_CLIENT_PERMISSION_NONE                              = 0,
    NM_CLIENT_PERMISSION_ENABLE_DISABLE_NETWORK            = 1,
    NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIFI               = 2,
    NM_CLIENT_PERMISSION_ENABLE_DISABLE_WWAN               = 3,
    NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX              = 4,
    NM_CLIENT_PERMISSION_SLEEP_WAKE                        = 5,
    NM_CLIENT_PERMISSION_NETWORK_CONTROL                   = 6,
    NM_CLIENT_PERMISSION_WIFI_SHARE_PROTECTED              = 7,
    NM_CLIENT_PERMISSION_WIFI_SHARE_OPEN                   = 8,
    NM_CLIENT_PERMISSION_SETTINGS_MODIFY_SYSTEM            = 9,
    NM_CLIENT_PERMISSION_SETTINGS_MODIFY_OWN               = 10,
    NM_CLIENT_PERMISSION_SETTINGS_MODIFY_HOSTNAME          = 11,
    NM_CLIENT_PERMISSION_SETTINGS_MODIFY_GLOBAL_DNS        = 12,
    NM_CLIENT_PERMISSION_RELOAD                            = 13,
    NM_CLIENT_PERMISSION_CHECKPOINT_ROLLBACK               = 14,
    NM_CLIENT_PERMISSION_ENABLE_DISABLE_STATISTICS         = 15,
    NM_CLIENT_PERMISSION_ENABLE_DISABLE_CONNECTIVITY_CHECK = 16,
    NM_CLIENT_PERMISSION_WIFI_SCAN                         = 17,
    NM_CLIENT_PERMISSION_CONNECTIVITY_SPARE_CHECK          = 18,

    NM_CLIENT_PERMISSION_LAST = 18,
} NMClientPermission;

/**
 * NMClientPermissionResult:
 * @NM_CLIENT_PERMISSION_RESULT_UNKNOWN: unknown or no authorization
 * @NM_CLIENT_PERMISSION_RESULT_YES: the permission is available
 * @NM_CLIENT_PERMISSION_RESULT_AUTH: authorization is necessary before the
 *  permission is available
 * @NM_CLIENT_PERMISSION_RESULT_NO: permission to perform the operation is
 *  denied by system policy
 *
 * #NMClientPermissionResult values indicate what authorizations and permissions
 * the user requires to obtain a given #NMClientPermission
 **/
typedef enum {
    NM_CLIENT_PERMISSION_RESULT_UNKNOWN = 0,
    NM_CLIENT_PERMISSION_RESULT_YES,
    NM_CLIENT_PERMISSION_RESULT_AUTH,
    NM_CLIENT_PERMISSION_RESULT_NO
} NMClientPermissionResult;

/**
 * NMRadioFlags:
 * @NM_RADIO_FLAG_NONE: an alias for numeric zero, no flags set.
 * @NM_RADIO_FLAG_WLAN_AVAILABLE: A Wireless LAN device or rfkill switch
 *   is detected in the system.
 * @NM_RADIO_FLAG_WWAN_AVAILABLE: A Wireless WAN device or rfkill switch
 *   is detected in the system.
 *
 * Flags related to radio interfaces.
 *
 * Since: 1.38
 */
typedef enum /*< flags >*/ {
    NM_RADIO_FLAG_NONE           = 0,
    NM_RADIO_FLAG_WLAN_AVAILABLE = 0x1,
    NM_RADIO_FLAG_WWAN_AVAILABLE = 0x2,
} NMRadioFlags;

/**
 * NMMptcpFlags:
 * @NM_MPTCP_FLAGS_NONE: The default, meaning that no MPTCP flags are set.
 * @NM_MPTCP_FLAGS_DISABLED: don't configure MPTCP endpoints on the device.
 * @NM_MPTCP_FLAGS_ENABLED: MPTCP is enabled and endpoints will be configured.
 *   This flag is implied if any of the other flags indicate that
 *   MPTCP is enabled and therefore in most cases unnecessary.
 *   Note that if "/proc/sys/net/mptcp/enabled" sysctl is disabled, MPTCP
 *   handling is disabled despite this flag. This can be overruled with the
 *   "also-without-sysctl" flag.
 *   Note that by default interfaces that don't have a default route are
 *   excluded from having MPTCP endpoints configured. This can be overruled
 *   with the "also-without-default-route" and this affects endpoints
 *   per address family.
 * @NM_MPTCP_FLAGS_ALSO_WITHOUT_SYSCTL: even if MPTCP handling is enabled
 *   via the "enabled" flag, it is ignored unless "/proc/sys/net/mptcp/enabled"
 *   is on. With this flag, MPTCP endpoints will be configured regardless
 *   of the sysctl setting.
 * @NM_MPTCP_FLAGS_ALSO_WITHOUT_DEFAULT_ROUTE: even if MPTCP handling is enabled
 *   via the "enabled" flag, it is ignored per-address family unless NetworkManager
 *   configures a default route. With this flag, NetworkManager will also configure
 *   MPTCP endpoints if there is no default route. This takes effect per-address
 *   family.
 * @NM_MPTCP_FLAGS_SIGNAL: Flag for the MPTCP endpoint. The endpoint will be
 *   announced/signaled to each peer via an MPTCP ADD_ADDR sub-option.
 * @NM_MPTCP_FLAGS_SUBFLOW: Flag for the MPTCP endpoint. If additional subflow creation
 *   is allowed by the MPTCP limits, the MPTCP path manager will try to create an
 *   additional subflow using this endpoint as the source address after the MPTCP connection
 *   is established.
 * @NM_MPTCP_FLAGS_BACKUP: Flag for the MPTCP endpoint. If this is a subflow endpoint, the
 *   subflows created using this endpoint will have the backup flag set during the connection
 *   process. This flag instructs the peer to only send data on a given subflow when all
 *   non-backup subflows are unavailable. This does not affect outgoing data,
 *   where subflow priority is determined by the backup/non-backup flag received
 *   from the peer
 * @NM_MPTCP_FLAGS_FULLMESH: Flag for the MPTCP endpoint. If this is a subflow endpoint and additional
 *   subflow creation is allowed by the MPTCP limits, the MPTCP path manager will try to create an
 *   additional subflow for each known peer address, using this endpoint as the source address.
 *   This will occur after the MPTCP connection is established. If the peer did not announce
 *   any additional addresses using the MPTCP ADD_ADDR sub-option, this will behave the same
 *   as a plain subflow endpoint. When the peer does announce addresses, each received ADD_ADDR
 *   sub-option will trigger creation of an additional subflow to generate a full mesh topology.
 *
 * Since: 1.40
 */
typedef enum /*< flags >*/ {
    NM_MPTCP_FLAGS_NONE = 0,

    NM_MPTCP_FLAGS_DISABLED = 0x1,
    NM_MPTCP_FLAGS_ENABLED  = 0x2,

    NM_MPTCP_FLAGS_ALSO_WITHOUT_SYSCTL        = 0x4,
    NM_MPTCP_FLAGS_ALSO_WITHOUT_DEFAULT_ROUTE = 0x8,

    NM_MPTCP_FLAGS_SIGNAL   = 0x10,
    NM_MPTCP_FLAGS_SUBFLOW  = 0x20,
    NM_MPTCP_FLAGS_BACKUP   = 0x40,
    NM_MPTCP_FLAGS_FULLMESH = 0x80,
} NMMptcpFlags;

/* For secrets requests, hints starting with "x-vpn-message:" are a message to show, not
 * a secret to request
 */
#define NM_SECRET_TAG_VPN_MSG "x-vpn-message:"

/* For secrets requests, hints starting with "x-dynamic-challenge(-echo):" are dynamic
 * 2FA challenges that are requested in a second authentication step, after the password
 * (or whatever auth method is used) was already successfully validated. Because of
 * that, the default secrets of the service mustn't be requested (again).
 * When using the "-echo" variant, the user input doesn't need to be hidden even
 * without --show-secrets
 *
 * Note: currently only implemented for VPN, but can be extended.
 */
#define NM_SECRET_TAG_DYNAMIC_CHALLENGE      "x-dynamic-challenge:"
#define NM_SECRET_TAG_DYNAMIC_CHALLENGE_ECHO "x-dynamic-challenge-echo:"

#endif /* __NM_DBUS_INTERFACE_H__ */
