From 488b7e40275762b872a22dd008d6f76e008a19e1 Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Fri, 19 Oct 2012 12:04:31 +0200 Subject: server/reds.c: split off reds-private.h --- server/reds-private.h | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 182 insertions(+) create mode 100644 server/reds-private.h (limited to 'server/reds-private.h') diff --git a/server/reds-private.h b/server/reds-private.h new file mode 100644 index 00000000..3db6565b --- /dev/null +++ b/server/reds-private.h @@ -0,0 +1,182 @@ +#ifndef REDS_PRIVATE_H +#define REDS_PRIVATE_H + +#include + +#include + +#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; + +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; + +#endif -- cgit