/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * Copyright (C) 2004 Red Hat, Inc.
 */

/* D-Bus-related definitions for NetworkManager VPN plugins.
 *
 * 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_VPN_DBUS_INTERFACE_H__
#define __NM_VPN_DBUS_INTERFACE_H__

#include "nm-dbus-interface.h"

#ifndef NM_VERSION_H
    #define NM_DEPRECATED_IN_1_8_FOR(n)
#endif

/*
 * dbus services details
 */
#define NM_DBUS_PATH_VPN      "/org/freedesktop/NetworkManager/VPN/Manager"
#define NM_DBUS_INTERFACE_VPN "org.freedesktop.NetworkManager.VPN.Manager"

#define NM_DBUS_PATH_VPN_CONNECTION      "/org/freedesktop/NetworkManager/VPN/Connection"
#define NM_DBUS_INTERFACE_VPN_CONNECTION "org.freedesktop.NetworkManager.VPN.Connection"

#define NM_VPN_DBUS_PLUGIN_PATH      "/org/freedesktop/NetworkManager/VPN/Plugin"
#define NM_VPN_DBUS_PLUGIN_INTERFACE "org.freedesktop.NetworkManager.VPN.Plugin"

/*
 * VPN Errors
 */
#define NM_DBUS_NO_ACTIVE_VPN_CONNECTION \
    "org.freedesktop.NetworkManager.VPNConnections.NoActiveVPNConnection"
#define NM_DBUS_NO_VPN_CONNECTIONS "org.freedesktop.NetworkManager.VPNConnections.NoVPNConnections"
#define NM_DBUS_INVALID_VPN_CONNECTION \
    "org.freedesktop.NetworkManager.VPNConnections.InvalidVPNConnection"

#define NM_DBUS_VPN_ERROR_PREFIX              "org.freedesktop.NetworkManager.VPN.Error"
#define NM_DBUS_VPN_STARTING_IN_PROGRESS      "StartingInProgress"
#define NM_DBUS_VPN_ALREADY_STARTED           "AlreadyStarted"
#define NM_DBUS_VPN_STOPPING_IN_PROGRESS      "StoppingInProgress"
#define NM_DBUS_VPN_ALREADY_STOPPED           "AlreadyStopped"
#define NM_DBUS_VPN_WRONG_STATE               "WrongState"
#define NM_DBUS_VPN_BAD_ARGUMENTS             "BadArguments"
#define NM_DBUS_VPN_INTERACTIVE_NOT_SUPPORTED "InteractiveNotSupported"

/*
 * VPN daemon signals
 */
#define NM_DBUS_VPN_SIGNAL_LOGIN_BANNER   "LoginBanner"
#define NM_DBUS_VPN_SIGNAL_LOGIN_FAILED   "LoginFailed"
#define NM_DBUS_VPN_SIGNAL_LAUNCH_FAILED  "LaunchFailed"
#define NM_DBUS_VPN_SIGNAL_CONNECT_FAILED "ConnectFailed"
#define NM_DBUS_VPN_SIGNAL_VPN_CONFIG_BAD "VPNConfigBad"
#define NM_DBUS_VPN_SIGNAL_IP_CONFIG_BAD  "IPConfigBad"
#define NM_DBUS_VPN_SIGNAL_STATE_CHANGE   "StateChange"
#define NM_DBUS_VPN_SIGNAL_IP4_CONFIG     "IP4Config"

/**
 * NMVpnServiceState:
 * @NM_VPN_SERVICE_STATE_UNKNOWN: The state of the VPN plugin is unknown.
 * @NM_VPN_SERVICE_STATE_INIT: The VPN plugin is initialized.
 * @NM_VPN_SERVICE_STATE_SHUTDOWN: Not used.
 * @NM_VPN_SERVICE_STATE_STARTING: The plugin is attempting to connect to a VPN server.
 * @NM_VPN_SERVICE_STATE_STARTED: The plugin has connected to a VPN server.
 * @NM_VPN_SERVICE_STATE_STOPPING: The plugin is disconnecting from the VPN server.
 * @NM_VPN_SERVICE_STATE_STOPPED: The plugin has disconnected from the VPN server.
 *
 * VPN daemon states
 */
typedef enum {
    NM_VPN_SERVICE_STATE_UNKNOWN = 0,
    NM_VPN_SERVICE_STATE_INIT,
    NM_VPN_SERVICE_STATE_SHUTDOWN,
    NM_VPN_SERVICE_STATE_STARTING,
    NM_VPN_SERVICE_STATE_STARTED,
    NM_VPN_SERVICE_STATE_STOPPING,
    NM_VPN_SERVICE_STATE_STOPPED
} NMVpnServiceState;

/**
 * NMVpnConnectionState:
 * @NM_VPN_CONNECTION_STATE_UNKNOWN: The state of the VPN connection is
 *   unknown.
 * @NM_VPN_CONNECTION_STATE_PREPARE: The VPN connection is preparing to
 *   connect.
 * @NM_VPN_CONNECTION_STATE_NEED_AUTH: The VPN connection needs authorization
 *   credentials.
 * @NM_VPN_CONNECTION_STATE_CONNECT: The VPN connection is being established.
 * @NM_VPN_CONNECTION_STATE_IP_CONFIG_GET: The VPN connection is getting an IP
 *   address.
 * @NM_VPN_CONNECTION_STATE_ACTIVATED: The VPN connection is active.
 * @NM_VPN_CONNECTION_STATE_FAILED: The VPN connection failed.
 * @NM_VPN_CONNECTION_STATE_DISCONNECTED: The VPN connection is disconnected.
 *
 * VPN connection states
 */
typedef enum {
    NM_VPN_CONNECTION_STATE_UNKNOWN = 0,
    NM_VPN_CONNECTION_STATE_PREPARE,
    NM_VPN_CONNECTION_STATE_NEED_AUTH,
    NM_VPN_CONNECTION_STATE_CONNECT,
    NM_VPN_CONNECTION_STATE_IP_CONFIG_GET,
    NM_VPN_CONNECTION_STATE_ACTIVATED,
    NM_VPN_CONNECTION_STATE_FAILED,
    NM_VPN_CONNECTION_STATE_DISCONNECTED
} NMVpnConnectionState;

/**
 * NMVpnConnectionStateReason:
 * @NM_VPN_CONNECTION_STATE_REASON_UNKNOWN: The reason for the VPN connection
 *   state change is unknown.
 * @NM_VPN_CONNECTION_STATE_REASON_NONE: No reason was given for the VPN
 *   connection state change.
 * @NM_VPN_CONNECTION_STATE_REASON_USER_DISCONNECTED: The VPN connection changed
 *   state because the user disconnected it.
 * @NM_VPN_CONNECTION_STATE_REASON_DEVICE_DISCONNECTED: The VPN connection
 *   changed state because the device it was using was disconnected.
 * @NM_VPN_CONNECTION_STATE_REASON_SERVICE_STOPPED: The service providing the
 *   VPN connection was stopped.
 * @NM_VPN_CONNECTION_STATE_REASON_IP_CONFIG_INVALID: The IP config of the VPN
 *   connection was invalid.
 * @NM_VPN_CONNECTION_STATE_REASON_CONNECT_TIMEOUT: The connection attempt to
 *   the VPN service timed out.
 * @NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_TIMEOUT: A timeout occurred
 *   while starting the service providing the VPN connection.
 * @NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_FAILED: Starting the service
 *   starting the service providing the VPN connection failed.
 * @NM_VPN_CONNECTION_STATE_REASON_NO_SECRETS: Necessary secrets for the VPN
 *   connection were not provided.
 * @NM_VPN_CONNECTION_STATE_REASON_LOGIN_FAILED: Authentication to the VPN
 *   server failed.
 * @NM_VPN_CONNECTION_STATE_REASON_CONNECTION_REMOVED: The connection was
 *   deleted from settings.
 *
 * VPN connection state reasons
 */
NM_DEPRECATED_IN_1_8_FOR(NMActiveConnectionStateReason)
typedef enum {
    NM_VPN_CONNECTION_STATE_REASON_UNKNOWN = NM_ACTIVE_CONNECTION_STATE_REASON_UNKNOWN,
    NM_VPN_CONNECTION_STATE_REASON_NONE    = NM_ACTIVE_CONNECTION_STATE_REASON_NONE,
    NM_VPN_CONNECTION_STATE_REASON_USER_DISCONNECTED =
        NM_ACTIVE_CONNECTION_STATE_REASON_USER_DISCONNECTED,
    NM_VPN_CONNECTION_STATE_REASON_DEVICE_DISCONNECTED =
        NM_ACTIVE_CONNECTION_STATE_REASON_DEVICE_DISCONNECTED,
    NM_VPN_CONNECTION_STATE_REASON_SERVICE_STOPPED =
        NM_ACTIVE_CONNECTION_STATE_REASON_SERVICE_STOPPED,
    NM_VPN_CONNECTION_STATE_REASON_IP_CONFIG_INVALID =
        NM_ACTIVE_CONNECTION_STATE_REASON_IP_CONFIG_INVALID,
    NM_VPN_CONNECTION_STATE_REASON_CONNECT_TIMEOUT =
        NM_ACTIVE_CONNECTION_STATE_REASON_CONNECT_TIMEOUT,
    NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_TIMEOUT =
        NM_ACTIVE_CONNECTION_STATE_REASON_SERVICE_START_TIMEOUT,
    NM_VPN_CONNECTION_STATE_REASON_SERVICE_START_FAILED =
        NM_ACTIVE_CONNECTION_STATE_REASON_SERVICE_START_FAILED,
    NM_VPN_CONNECTION_STATE_REASON_NO_SECRETS   = NM_ACTIVE_CONNECTION_STATE_REASON_NO_SECRETS,
    NM_VPN_CONNECTION_STATE_REASON_LOGIN_FAILED = NM_ACTIVE_CONNECTION_STATE_REASON_LOGIN_FAILED,
    NM_VPN_CONNECTION_STATE_REASON_CONNECTION_REMOVED =
        NM_ACTIVE_CONNECTION_STATE_REASON_CONNECTION_REMOVED,
} NMVpnConnectionStateReason;

/**
 * NMVpnPluginFailure:
 * @NM_VPN_PLUGIN_FAILURE_LOGIN_FAILED: Login failed.
 * @NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED: Connect failed.
 * @NM_VPN_PLUGIN_FAILURE_BAD_IP_CONFIG: Invalid IP configuration returned from
 *   the VPN plugin.
 *
 * VPN plugin failure reasons
 */
typedef enum {
    NM_VPN_PLUGIN_FAILURE_LOGIN_FAILED,
    NM_VPN_PLUGIN_FAILURE_CONNECT_FAILED,
    NM_VPN_PLUGIN_FAILURE_BAD_IP_CONFIG
} NMVpnPluginFailure;

#ifndef NM_VERSION_H
    #undef NM_DEPRECATED_IN_1_8_FOR
#endif

/*** Generic config ***/

/* string: VPN interface name (tun0, tap0, etc) */
#define NM_VPN_PLUGIN_CONFIG_TUNDEV "tundev"

/* string: Proxy PAC */
#define NM_VPN_PLUGIN_CONFIG_PROXY_PAC "pac"

/* string: Login message */
#define NM_VPN_PLUGIN_CONFIG_BANNER "banner"

/* uint32 / array of uint8: IP address of the public external VPN gateway (network byte order) */
#define NM_VPN_PLUGIN_CONFIG_EXT_GATEWAY "gateway"

/* uint32: Maximum Transfer Unit that the VPN interface should use */
#define NM_VPN_PLUGIN_CONFIG_MTU "mtu"

/* boolean: Has IP4 configuration? */
#define NM_VPN_PLUGIN_CONFIG_HAS_IP4 "has-ip4"

/* boolean: Has IP6 configuration? */
#define NM_VPN_PLUGIN_CONFIG_HAS_IP6 "has-ip6"

/* boolean: If %TRUE the VPN plugin can persist/reconnect the connection over
 * link changes and VPN server dropouts.
 */
#define NM_VPN_PLUGIN_CAN_PERSIST "can-persist"

/*** Ip4Config ***/

/* uint32: IP address of the internal gateway of the subnet the VPN interface is
 *         on, if the VPN uses subnet configuration (network byte order)
 */
#define NM_VPN_PLUGIN_IP4_CONFIG_INT_GATEWAY "internal-gateway"

/* uint32: internal IP address of the local VPN interface (network byte order) */
#define NM_VPN_PLUGIN_IP4_CONFIG_ADDRESS "address"

/* uint32: IP address of the other side of Point-to-Point connection if the VPN
 *         uses Point-to-Point configuration. (network byte order)
 */
#define NM_VPN_PLUGIN_IP4_CONFIG_PTP "ptp"

/* uint32: IP prefix of the VPN interface; 1 - 32 inclusive */
#define NM_VPN_PLUGIN_IP4_CONFIG_PREFIX "prefix"

/* array of uint32: IP addresses of DNS servers for the VPN (network byte order) */
#define NM_VPN_PLUGIN_IP4_CONFIG_DNS "dns"

/* array of uint32: IP addresses of NBNS/WINS servers for the VPN (network byte order) */
#define NM_VPN_PLUGIN_IP4_CONFIG_NBNS "nbns"

/* uint32: Message Segment Size that the VPN interface should use */
#define NM_VPN_PLUGIN_IP4_CONFIG_MSS "mss"

/* string: DNS domain name */
#define NM_VPN_PLUGIN_IP4_CONFIG_DOMAIN "domain"

/* array of strings: DNS domain names */
#define NM_VPN_PLUGIN_IP4_CONFIG_DOMAINS "domains"

/* [ip4 routes]: custom routes the client should apply, in the format used
 *         by nm_utils_ip4_routes_to/from_gvalue
 */
#define NM_VPN_PLUGIN_IP4_CONFIG_ROUTES "routes"

/* whether the previous IP4 routing configuration should be preserved. */
#define NM_VPN_PLUGIN_IP4_CONFIG_PRESERVE_ROUTES "preserve-routes"

/* boolean: prevent this VPN connection from ever getting the default route */
#define NM_VPN_PLUGIN_IP4_CONFIG_NEVER_DEFAULT "never-default"

/* Deprecated */
#define NM_VPN_PLUGIN_IP4_CONFIG_GATEWAY NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY

/* Legacy IP4 items; these are included in the IP4 config by older plugins,
 * but in the generic config by newer plugins.
 */

#define NM_VPN_PLUGIN_IP4_CONFIG_BANNER      NM_VPN_PLUGIN_CONFIG_BANNER
#define NM_VPN_PLUGIN_IP4_CONFIG_EXT_GATEWAY NM_VPN_PLUGIN_CONFIG_EXT_GATEWAY
#define NM_VPN_PLUGIN_IP4_CONFIG_MTU         NM_VPN_PLUGIN_CONFIG_MTU
#define NM_VPN_PLUGIN_IP4_CONFIG_TUNDEV      NM_VPN_PLUGIN_CONFIG_TUNDEV

/*** Ip6Config ***/

/* array of uint8: IP address of the internal gateway of the subnet the VPN interface is
 *         on, if the VPN uses subnet configuration (network byte order)
 */
#define NM_VPN_PLUGIN_IP6_CONFIG_INT_GATEWAY "internal-gateway"

/* array of uint8: internal IP address of the local VPN interface (network byte order) */
#define NM_VPN_PLUGIN_IP6_CONFIG_ADDRESS "address"

/* array of uint8: IP address of the other side of Point-to-Point connection if the VPN
 *         uses Point-to-Point configuration. (network byte order)
 */
#define NM_VPN_PLUGIN_IP6_CONFIG_PTP "ptp"

/* uint32: prefix length of the VPN interface; 1 - 128 inclusive */
#define NM_VPN_PLUGIN_IP6_CONFIG_PREFIX "prefix"

/* array of array of uint8: IP addresses of DNS servers for the VPN (network byte order) */
#define NM_VPN_PLUGIN_IP6_CONFIG_DNS "dns"

/* uint32: Message Segment Size that the VPN interface should use */
#define NM_VPN_PLUGIN_IP6_CONFIG_MSS "mss"

/* string: DNS domain name */
#define NM_VPN_PLUGIN_IP6_CONFIG_DOMAIN "domain"

/* array of strings: DNS domain names */
#define NM_VPN_PLUGIN_IP6_CONFIG_DOMAINS "domains"

/* [ip6 routes]: custom routes the client should apply, in the format used
 *         by nm_utils_ip6_routes_to/from_gvalue
 */
#define NM_VPN_PLUGIN_IP6_CONFIG_ROUTES "routes"

/* whether the previous IP6 routing configuration should be preserved. */
#define NM_VPN_PLUGIN_IP6_CONFIG_PRESERVE_ROUTES "preserve-routes"

/* boolean: prevent this VPN connection from ever getting the default route */
#define NM_VPN_PLUGIN_IP6_CONFIG_NEVER_DEFAULT "never-default"

#endif /* __NM_VPN_DBUS_INTERFACE_H__ */
