/* * Copyright © 2017 Red Hat, Inc * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . * * Authors: * Christian J. Kellner */ #pragma once #include "bolt-names.h" #include "bolt-enum-types.h" gboolean bolt_enum_validate (GType enum_type, gint value, GError **error); gboolean bolt_enum_class_validate (GEnumClass *enum_class, gint value, GError **error); const char * bolt_enum_to_string (GType enum_type, gint value, GError **error); gint bolt_enum_from_string (GType enum_type, const char *string, GError **error); char * bolt_flags_class_to_string (GFlagsClass *flags_class, guint value, GError **error); gboolean bolt_flags_class_from_string (GFlagsClass *flags_class, const char *string, guint *flags_out, GError **error); char * bolt_flags_to_string (GType flags_type, guint value, GError **error); gboolean bolt_flags_from_string (GType flags_type, const char *string, guint *flags_out, GError **error); gboolean bolt_flags_update (guint from, guint *to, guint mask); #define bolt_flag_isset(flags_, flag_) (!!(flags_ & flag_)) #define bolt_flag_isclear(flags_, flag_) (!(flags_ & flag_)) /** * BoltStatus: * @BOLT_STATUS_UNKNOWN: Device is in an unknown state (should normally not happen). * @BOLT_STATUS_DISCONNECTED: Device is not connected. * @BOLT_STATUS_CONNECTING: Device is currently being connected. * @BOLT_STATUS_CONNECTED: Device is connected, but not authorized. * @BOLT_STATUS_AUTHORIZING: Device is currently authorizing. * @BOLT_STATUS_AUTH_ERROR: Failed to authorize a device via a key. * @BOLT_STATUS_AUTHORIZED: Device connected and authorized. * @BOLT_STATUS_AUTHORIZED_SECURE: Device connected and securely authorized via a key (deprecated). * @BOLT_STATUS_AUTHORIZED_NEWKEY: Device connected and authorized via a new key (deprecated). * @BOLT_STATUS_AUTHORIZED_DPONLY: Device authorized but with thunderbolt disabled (deprecated). * * The current status of the device. */ typedef enum { BOLT_STATUS_UNKNOWN = -1, BOLT_STATUS_DISCONNECTED = 0, BOLT_STATUS_CONNECTING, BOLT_STATUS_CONNECTED, BOLT_STATUS_AUTHORIZING, BOLT_STATUS_AUTH_ERROR, BOLT_STATUS_AUTHORIZED, /* deprecated, do not use */ BOLT_STATUS_AUTHORIZED_SECURE, BOLT_STATUS_AUTHORIZED_NEWKEY, BOLT_STATUS_AUTHORIZED_DPONLY } BoltStatus; const char * bolt_status_to_string (BoltStatus status); gboolean bolt_status_is_authorized (BoltStatus status); gboolean bolt_status_is_connected (BoltStatus status); gboolean bolt_status_is_pending (BoltStatus status); gboolean bolt_status_validate (BoltStatus status); /** * BoltAuthFlags: * @BOLT_AUTH_NONE: No specific authorization. * @BOLT_AUTH_NOPCIE: PCIe tunnels are *not* authorized. * @BOLT_AUTH_SECURE: Device is securely authorized. * @BOLT_AUTH_NOKEY: Device does *not* support key verification. * @BOLT_AUTH_BOOT: Device was already authorized during pre-boot. * * More specific information about device authorization. */ typedef enum { /*< flags >*/ BOLT_AUTH_NONE = 0, BOLT_AUTH_NOPCIE = 1 << 0, BOLT_AUTH_SECURE = 1 << 1, BOLT_AUTH_NOKEY = 1 << 2, BOLT_AUTH_BOOT = 1 << 3, } BoltAuthFlags; /** * BoltKeyState: * @BOLT_KEY_UNKNOWN: unknown key state * @BOLT_KEY_MISSING: no key * @BOLT_KEY_HAVE: key exists * @BOLT_KEY_NEW: key is new * * The state of the key. */ typedef enum { BOLT_KEY_UNKNOWN = -1, BOLT_KEY_MISSING = 0, BOLT_KEY_HAVE = 1, BOLT_KEY_NEW = 2 } BoltKeyState; /** * BoltSecurity: * @BOLT_SECURITY_UNKNOWN : Unknown security. * @BOLT_SECURITY_NONE : No security, all devices are automatically connected. * @BOLT_SECURITY_DPONLY : Display Port only devices only. * @BOLT_SECURITY_USER : User needs to authorize devices. * @BOLT_SECURITY_SECURE : User needs to authorize devices. Authorization can * be done via key exchange to verify the device identity. * @BOLT_SECURITY_USBONLY : Only create a PCIe tunnel to the USB controller in a * connected thunderbolt dock, allowing no downstream PCIe tunnels. * * The security level of the thunderbolt domain. */ typedef enum { BOLT_SECURITY_UNKNOWN = -1, BOLT_SECURITY_NONE = 0, BOLT_SECURITY_DPONLY = 1, BOLT_SECURITY_USER = '1', BOLT_SECURITY_SECURE = '2', BOLT_SECURITY_USBONLY = 4, } BoltSecurity; BoltSecurity bolt_security_from_string (const char *str); const char * bolt_security_to_string (BoltSecurity security); gboolean bolt_security_validate (BoltSecurity security); gboolean bolt_security_allows_pcie (BoltSecurity security); /** * BoltPolicy: * @BOLT_POLICY_UNKNOWN: Unknown policy. * @BOLT_POLICY_DEFAULT: Default policy. * @BOLT_POLICY_MANUAL: Manual authorization of the device. * @BOLT_POLICY_AUTO: Connect the device automatically, * with the best possible security level supported * by the domain controller. * * What do to for connected devices. */ typedef enum { BOLT_POLICY_UNKNOWN = -1, BOLT_POLICY_DEFAULT = 0, BOLT_POLICY_MANUAL = 1, BOLT_POLICY_AUTO = 2, } BoltPolicy; BoltPolicy bolt_policy_from_string (const char *str); const char * bolt_policy_to_string (BoltPolicy policy); gboolean bolt_policy_validate (BoltPolicy policy); /** * BoltAuthCtrl: * @BOLT_AUTHCTRL_NONE: No authorization flags. * * Control authorization. */ typedef enum { /*< flags >*/ BOLT_AUTHCTRL_NONE = 0 } BoltAuthCtrl; /** * BoltDeviceType: * @BOLT_DEVICE_UNKNOWN_TYPE: Unknown device type * @BOLT_DEVICE_HOST: The device representing the host * @BOLT_DEVICE_PERIPHERAL: A generic thunderbolt peripheral * * The type of the device. */ typedef enum { BOLT_DEVICE_UNKNOWN_TYPE = -1, BOLT_DEVICE_HOST = 0, BOLT_DEVICE_PERIPHERAL } BoltDeviceType; BoltDeviceType bolt_device_type_from_string (const char *str); const char * bolt_device_type_to_string (BoltDeviceType type); gboolean bolt_device_type_validate (BoltDeviceType type); gboolean bolt_device_type_is_host (BoltDeviceType type); /** * BoltAuthMode: * @BOLT_AUTH_DISABLED: Authorization is disabled * @BOLT_AUTH_ENABLED: Authorization is enabled. * * Control authorization. */ typedef enum { /*< flags >*/ BOLT_AUTH_DISABLED = 0, BOLT_AUTH_ENABLED = 1 } BoltAuthMode; #define bolt_auth_mode_is_enabled(auth) ((auth & BOLT_AUTH_ENABLED) != 0) #define bolt_auth_mode_is_disabled(auth) (!bolt_auth_mode_is_enabled (auth))