summaryrefslogtreecommitdiffstats
path: root/server/reds.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/reds.c')
-rw-r--r--server/reds.c180
1 files changed, 4 insertions, 176 deletions
diff --git a/server/reds.c b/server/reds.c
index 9fc00570..98c87061 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -75,6 +75,8 @@
#include "smartcard.h"
#endif
+#include "reds-private.h"
+
SpiceCoreInterface *core = NULL;
static SpiceCharDeviceInstance *vdagent = NULL;
static SpiceMigrateInstance *migration_interface = NULL;
@@ -93,6 +95,8 @@ static SpiceMigrateInstance *migration_interface = NULL;
#define REDS_TOKENS_TO_SEND 5
#define REDS_VDI_PORT_NUM_RECEIVE_BUFFS 5
+static TicketAuthentication taTicket;
+
static int spice_port = -1;
static int spice_secure_port = -1;
static int spice_listen_socket_fd = -1;
@@ -121,182 +125,6 @@ int agent_mouse = TRUE;
int agent_copypaste = TRUE;
static bool exit_on_disconnect = FALSE;
-#define MIGRATE_TIMEOUT (1000 * 10) /* 10sec */
-#define MM_TIMER_GRANULARITY_MS (1000 / 30)
-#define MM_TIME_DELTA 400 /*ms*/
-
-typedef struct TicketAuthentication {
- char password[SPICE_MAX_PASSWORD_LENGTH];
- time_t expiration_time;
-} TicketAuthentication;
-
-static TicketAuthentication taTicket;
-
-typedef struct TicketInfo {
- RSA *rsa;
- int rsa_size;
- BIGNUM *bn;
- SpiceLinkEncryptedTicket encrypted_ticket;
-} TicketInfo;
-
-typedef struct MonitorMode {
- uint32_t x_res;
- uint32_t y_res;
-} MonitorMode;
-
-typedef struct VDIReadBuf {
- RingItem link;
- uint32_t refs;
-
- int len;
- uint8_t data[SPICE_AGENT_MAX_DATA_SIZE];
-} VDIReadBuf;
-
-static VDIReadBuf *vdi_port_read_buf_get(void);
-static VDIReadBuf *vdi_port_read_buf_ref(VDIReadBuf *buf);
-static void vdi_port_read_buf_unref(VDIReadBuf *buf);
-
-enum {
- VDI_PORT_READ_STATE_READ_HEADER,
- VDI_PORT_READ_STATE_GET_BUFF,
- VDI_PORT_READ_STATE_READ_DATA,
-};
-
-typedef struct VDIPortState {
- SpiceCharDeviceState *base;
- uint32_t plug_generation;
- int client_agent_started;
-
- /* write to agent */
- SpiceCharDeviceWriteBuffer *recv_from_client_buf;
- int recv_from_client_buf_pushed;
- AgentMsgFilter write_filter;
-
- /* read from agent */
- Ring read_bufs;
- uint32_t read_state;
- uint32_t message_recive_len;
- uint8_t *recive_pos;
- uint32_t recive_len;
- VDIReadBuf *current_read_buf;
- AgentMsgFilter read_filter;
-
- VDIChunkHeader vdi_chunk_header;
-
- SpiceMigrateDataMain *mig_data; /* storing it when migration data arrives
- before agent is attached */
-} VDIPortState;
-
-/* messages that are addressed to the agent and are created in the server */
-typedef struct __attribute__ ((__packed__)) VDInternalBuf {
- VDIChunkHeader chunk_header;
- VDAgentMessage header;
- union {
- VDAgentMouseState mouse_state;
- }
- u;
-} VDInternalBuf;
-
-#ifdef RED_STATISTICS
-
-#define REDS_MAX_STAT_NODES 100
-#define REDS_STAT_SHM_SIZE (sizeof(SpiceStat) + REDS_MAX_STAT_NODES * sizeof(SpiceStatNode))
-
-typedef struct RedsStatValue {
- uint32_t value;
- uint32_t min;
- uint32_t max;
- uint32_t average;
- uint32_t count;
-} RedsStatValue;
-
-#endif
-
-typedef struct RedsMigPendingLink {
- RingItem ring_link; // list of links that belongs to the same client
- SpiceLinkMess *link_msg;
- RedsStream *stream;
-} RedsMigPendingLink;
-
-typedef struct RedsMigTargetClient {
- RingItem link;
- RedClient *client;
- Ring pending_links;
-} RedsMigTargetClient;
-
-typedef struct RedsMigWaitDisconnectClient {
- RingItem link;
- RedClient *client;
-} RedsMigWaitDisconnectClient;
-
-typedef struct SpiceCharDeviceStateItem {
- RingItem link;
- SpiceCharDeviceState *st;
-} SpiceCharDeviceStateItem;
-
-/* Intermediate state for on going monitors config message from a single
- * client, being passed to the guest */
-typedef struct RedsClientMonitorsConfig {
- MainChannelClient *mcc;
- uint8_t *buffer;
- int buffer_size;
- int buffer_pos;
-} RedsClientMonitorsConfig;
-
-typedef struct RedsState {
- int listen_socket;
- int secure_listen_socket;
- SpiceWatch *listen_watch;
- SpiceWatch *secure_listen_watch;
- VDIPortState agent_state;
- int pending_mouse_event;
- Ring clients;
- int num_clients;
- MainChannel *main_channel;
-
- int mig_wait_connect; /* src waits for clients to establish connection to dest
- (before migration starts) */
- int mig_wait_disconnect; /* src waits for clients to disconnect (after migration completes) */
- Ring mig_wait_disconnect_clients; /* List of RedsMigWaitDisconnectClient. Holds the clients
- which the src waits for their disconnection */
-
- int mig_inprogress;
- int expect_migrate;
- int src_do_seamless_migrate; /* per migration. Updated after the migration handshake
- between the 2 servers */
- int dst_do_seamless_migrate; /* per migration. Updated after the migration handshake
- between the 2 servers */
- Ring mig_target_clients;
- int num_mig_target_clients;
- RedsMigSpice *mig_spice;
-
- int num_of_channels;
- Ring channels;
- int mouse_mode;
- int is_client_mouse_allowed;
- int dispatcher_allows_client_mouse;
- MonitorMode monitor_mode;
- SpiceTimer *mig_timer;
- SpiceTimer *mm_timer;
-
- int vm_running;
- Ring char_devs_states; /* list of SpiceCharDeviceStateItem */
- int seamless_migration_enabled; /* command line arg */
-
- SSL_CTX *ctx;
-
-#ifdef RED_STATISTICS
- char *stat_shm_name;
- SpiceStat *stat;
- pthread_mutex_t stat_lock;
- RedsStatValue roundtrip_stat;
-#endif
- int peer_minor_version;
- int allow_multiple_clients;
-
- RedsClientMonitorsConfig client_monitors_config;
-} RedsState;
-
static RedsState *reds = NULL;
typedef struct AsyncRead {