diff options
Diffstat (limited to 'server/reds.c')
-rw-r--r-- | server/reds.c | 180 |
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 { |