[Spice-devel] [PATCH v6 38/42] proto: Improve agent dissectors

Frediano Ziglio fziglio at redhat.com
Thu Aug 13 06:12:17 PDT 2015


Before, agent-related messages could only be shown as raw
data in wireshark

Signed-off-by: Frediano Ziglio <fziglio at redhat.com>
---
 spice.proto | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 120 insertions(+), 8 deletions(-)

diff --git a/spice.proto b/spice.proto
index 1aee85b..c7944ac 100644
--- a/spice.proto
+++ b/spice.proto
@@ -212,6 +212,124 @@ struct DstInfo {
 	uint8 *cert_subject_data[cert_subject_size] @zero_terminated @marshall @ws("data", data) @ws_type(BYTES);
 } @ctype(SpiceMigrationDstInfo);
 
+enum32 agent_type {
+    MOUSE_STATE = 1,
+    MONITORS_CONFIG,
+    REPLY,
+    CLIPBOARD,
+    DISPLAY_CONFIG,
+    ANNOUNCE_CAPABILITIES,
+    CLIPBOARD_GRAB,
+    CLIPBOARD_REQUEST,
+    CLIPBOARD_RELEASE,
+    FILE_XFER_START,
+    FILE_XFER_STATUS,
+    FILE_XFER_DATA,
+    CLIENT_DISCONNECTED,
+    END_MESSAGE
+} @ws("Agent message type", agent_message_type) @prefix(VS_AGENT_) @ifdef(DISSECTOR);
+
+flags16 mouse_button_mask {
+    LEFT,
+    MIDDLE,
+    RIGHT
+} @ws("Mouse button state", button_state) @ws_base(DEC);
+
+struct AgentMouseState {
+    Point point;
+    mouse_button_mask buttons_state;
+    uint8 display_id @ws("Mouse display ID", mouse_display_id);
+};
+
+struct AgentMonitorConfig {
+    uint32 height @ws("Height", agent_monitor_height);
+    uint32 width @ws("Width", agent_monitor_width);
+    uint32 depth @ws("Depth", agent_monitor_depth);
+    uint32 x @ws("x", agent_monitor_x);
+    uint32 y @ws("y", agent_monitor_y);
+} @ws_txt_n("Monitor Config #%u", INDEX);
+
+enum32 agent_reply_error {
+    SUCCESS = 0,
+    ERROR
+} @prefix(WSVD_AGENT_) @ws("Error", vd_agent_reply_error) @ifdef(DISSECTOR);
+
+flags32 agent_caps {
+    MOUSE_STATE @ws("Mouse State", vd_agent_cap_mouse_state),
+    MONITORS_CONFIG @ws("Monitors config", vd_agent_cap_monitors_config),
+    REPLY @ws("Reply", vd_agent_cap_reply),
+    CLIPBOARD @ws("Clipboard", vd_agent_cap_clipboard),
+    DISPLAY_CONFIG @ws("Display config", vd_agent_cap_display_config),
+    CLIPBOARD_BY_DEMAND @ws("Clipboard by demand", vd_agent_cap_clipboard_by_demand),
+    CLIPBOARD_SELECTION @ws("Clipboard selection", vd_agent_cap_clipboard_selection),
+    SPARSE_MONITORS_CONFIG @ws("Sparse monitors config", vd_agent_cap_sparse_monitors_config),
+    GUEST_LINEEND_LF @ws("Guest line-end LF", vd_agent_cap_guest_lineend_lf),
+    GUEST_LINEEND_CRL @ws("Guest line-end CRLF", vd_agent_cap_guest_lineend_crlf)
+} @prefix(WSVD_AGENT_CAP_) @ifdef(DISSECTOR);
+
+struct AgentMonitorsConfig {
+    uint32 num_monitors @ws("Number of monitors", agent_num_monitors);
+    uint32 use_position @ws("Use position", vd_agent_monitors_config_flag_use_pos) @ws_type(BOOLEAN);
+    AgentMonitorConfig configs[num_monitors];
+};
+
+struct AgentReply {
+    uint32 type @ws("Type", vd_agent_reply_type);
+    agent_reply_error error;
+};
+
+struct AgentCapabilities {
+    uint32 request @ws("Request", vd_agent_caps_request);
+    agent_caps reply;
+};
+
+struct AgentClipboardGrab {
+    uint8 selection @ws("Agent clipboard selection", main_agent_clipboard_selection);
+    uint8 reserved[3];
+};
+
+enum32 agent_clipboard_type {
+    NONE = 0,
+    UTF8_TEXT,
+    IMAGE_PNG,
+    IMAGE_BMP,
+    IMAGE_TIFF,
+    IMAGE_JPG
+} @ws("Agent clipboard type", main_agent_clipboard_type) @prefix(WSVD_AGENT_CLIPBOARD_) @ifdef(DISSECTOR);
+
+struct AgentClipboardRequest {
+    uint8 selection @ws("Agent clipboard selection", main_agent_clipboard_selection);
+    uint8 reserved[3];
+    agent_clipboard_type type;
+};
+
+message AgentData {
+    uint32 protocol @ws("Agent protocol version", main_agent_protocol);
+    agent_type type;
+    uint64 opaque @ws("Agent opaque", main_agent_opaque);
+    uint32 size @ws("Agent message size", main_agent_size);
+    switch (type) {
+    case MOUSE_STATE:
+	AgentMouseState mouse_state;
+    case MONITORS_CONFIG:
+	AgentMonitorsConfig monitors_config;
+    case REPLY:
+	AgentReply reply;
+    case CLIPBOARD:
+	Data text;
+    case DISPLAY_CONFIG:
+	uint32 config;
+    case ANNOUNCE_CAPABILITIES:
+	AgentCapabilities capabilities;
+    case CLIPBOARD_GRAB:
+	AgentClipboardGrab grab;
+    case CLIPBOARD_REQUEST:
+	AgentClipboardRequest request;
+    case CLIPBOARD_RELEASE:
+	Empty release;
+    } u @anon;
+};
+
 channel MainChannel : BaseChannel {
  server:
      message {
@@ -251,7 +369,7 @@ channel MainChannel : BaseChannel {
 	link_err error_code @ws("spice ERROR", error_code);
     } @ctype(SpiceMsgMainAgentDisconnect) agent_disconnected;
 
-    Data agent_data;
+    Data agent_data @ws_as(AgentData);
 
     message {
 	uint32 num_tokens @ws("Agent token", main_agent_token);
@@ -308,7 +426,7 @@ channel MainChannel : BaseChannel {
 	uint32 num_tokens @ws("Agent tokens", main_agent_tokens);
     } agent_start;
 
-    Data agent_data;
+    Data agent_data @ws_as(AgentData);
 
     message {
         uint32 num_tokens @ws("Agent token", main_agent_token);
@@ -970,12 +1088,6 @@ enum8 mouse_button {
     DOWN,
 };
 
-flags16 mouse_button_mask {
-    LEFT,
-    MIDDLE,
-    RIGHT
-} @ws("Mouse button state", button_state) @ws_base(DEC);
-
 struct WSMousePosition {
     Point pt;
     mouse_button_mask buttons_state;
-- 
2.4.3



More information about the Spice-devel mailing list