summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlon Levy <alevy@redhat.com>2012-10-19 12:04:31 +0200
committerAlon Levy <alevy@redhat.com>2012-10-25 12:31:39 +0200
commit488b7e40275762b872a22dd008d6f76e008a19e1 (patch)
tree0dbd9100c138ed0834d0e0b3c6976dd5e37c2de0
parentd227a5b6b689739aebe4ce27f1425bd0bb60cbd5 (diff)
downloadspice-488b7e40275762b872a22dd008d6f76e008a19e1.tar.gz
spice-488b7e40275762b872a22dd008d6f76e008a19e1.tar.xz
spice-488b7e40275762b872a22dd008d6f76e008a19e1.zip
server/reds.c: split off reds-private.h
-rw-r--r--server/reds-private.h182
-rw-r--r--server/reds.c180
2 files changed, 186 insertions, 176 deletions
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 <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 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 {