--- server/reds-private.h | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++ server/reds.c | 180 ++----------------------------------------------- 2 files changed, 186 insertions(+), 176 deletions(-) create mode 100644 server/reds-private.h diff --git a/server/reds-private.h b/server/reds-private.h new file mode 100644 index 0000000..3db6565 --- /dev/null +++ b/server/reds-private.h @@ -0,0 +1,182 @@ +#ifndef REDS_PRIVATE_H +#define REDS_PRIVATE_H + +#include <time.h> + +#include <spice/protocol.h> + +#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 diff --git a/server/reds.c b/server/reds.c index 9fc0057..98c8706 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 { -- 1.7.12.1 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/spice-devel