Index: trunk/src/VBox/Additions/x11/VBoxClient/wayland-helper-ipc.cpp
===================================================================
--- trunk/src/VBox/Additions/x11/VBoxClient/wayland-helper-ipc.cpp	(revision 108786)
+++ trunk/src/VBox/Additions/x11/VBoxClient/wayland-helper-ipc.cpp	(revision 108787)
@@ -153,5 +153,5 @@
 }
 
-int vbcl::ipc::packet_read(uint32_t uSessionId, RTLOCALIPCSESSION hSession, void **ppvData)
+int vbcl::ipc::packet_read(uint32_t uSessionId, RTLOCALIPCSESSION hSession, uint32_t msTimeout, void **ppvData)
 {
     int rc;
@@ -161,5 +161,5 @@
     AssertPtrReturn(ppvData, VERR_INVALID_PARAMETER);
 
-    rc = RTLocalIpcSessionWaitForData(hSession, VBOX_GTKIPC_RX_TIMEOUT_MS);
+    rc = RTLocalIpcSessionWaitForData(hSession, msTimeout);
     if (RT_SUCCESS(rc))
     {
@@ -285,5 +285,5 @@
     SHCLFORMATS fFormats = VBOX_SHCL_FMT_NONE;
 
-    rc = vbcl::ipc::packet_read(uSessionId, hIpcSession, (void **)&pPacket);
+    rc = vbcl::ipc::packet_read(uSessionId, hIpcSession, m_fFmts.timeout(), (void **)&pPacket);
     if (RT_SUCCESS(rc))
     {
@@ -342,5 +342,5 @@
     SHCLFORMATS uFormat = VBOX_SHCL_FMT_NONE;
 
-    rc = vbcl::ipc::packet_read(uSessionId, hIpcSession, (void **)&pPacket);
+    rc = vbcl::ipc::packet_read(uSessionId, hIpcSession, m_uFmt.timeout(), (void **)&pPacket);
     if (RT_SUCCESS(rc))
     {
@@ -409,5 +409,5 @@
     uint32_t cbData = 0;
 
-    rc = vbcl::ipc::packet_read(uSessionId, hIpcSession, (void **)&pPacket);
+    rc = vbcl::ipc::packet_read(uSessionId, hIpcSession, m_pvDataBuf.timeout(), (void **)&pPacket);
     if (RT_SUCCESS(rc))
     {
Index: trunk/src/VBox/Additions/x11/VBoxClient/wayland-helper-ipc.h
===================================================================
--- trunk/src/VBox/Additions/x11/VBoxClient/wayland-helper-ipc.h	(revision 108786)
+++ trunk/src/VBox/Additions/x11/VBoxClient/wayland-helper-ipc.h	(revision 108787)
@@ -63,4 +63,5 @@
 /** IPC server socket name prefixes. */
 #define VBOXWL_SRV_NAME_PREFIX_CLIP     "clip"
+#define VBOXWL_SRV_NAME_PREFIX_DND      "dnd"
 
 /** Arguments to vboxwl tool. */
@@ -68,4 +69,6 @@
 #define VBOXWL_ARG_CLIP_GH_ANNOUNCE     "--clip-gh-announce"
 #define VBOXWL_ARG_CLIP_GH_COPY         "--clip-gh-copy"
+#define VBOXWL_ARG_DND_GH               "--dnd-gh"
+#define VBOXWL_ARG_DND_HG               "--dnd-hg"
 #define VBOXWL_ARG_SESSION_ID           "--session-id"
 
@@ -147,8 +150,9 @@
          * @param   uSessionId      IPC session ID.
          * @param   hSession        IPC session handle.
+         * @param   mcTimeout       Read operation timeout in milliseconds.
          * @param   ppvData         Output buffer structured as validated
          *                          IPC packet (contains size inside).
          */
-        int packet_read(uint32_t uSessionId, RTLOCALIPCSESSION hSession, void **ppvData);
+        int packet_read(uint32_t uSessionId, RTLOCALIPCSESSION hSession, uint32_t msTimeout, void **ppvData);
 
         /**
@@ -195,5 +199,5 @@
              */
 
-            /** IPC flow description: Copy clipboard from host to guest. */
+            /** IPC flow description (clipboard): Copy clipboard from host to guest. */
             const flow_t HGCopyFlow[4] =
             {
@@ -204,5 +208,5 @@
             };
 
-            /** IPC flow description: Copy clipboard from guest to host. */
+            /** IPC flow description (clipboard): Copy clipboard from guest to host. */
             const flow_t GHCopyFlow[3] =
             {
@@ -212,5 +216,5 @@
             };
 
-            /** IPC flow description: Announce guest's clipboard to the host
+            /** IPC flow description (clipboard): Announce guest's clipboard to the host
              *  and copy it to the host in format selected by host. */
             const flow_t GHAnnounceAndCopyFlow[4] =
@@ -219,4 +223,28 @@
                 { VBOX_FORMAT,  FLOW_DIRECTION_CLIENT },
                 { VBOX_DATA,    FLOW_DIRECTION_SERVER },
+                { CMD_MAX,      false }
+            };
+
+            /** IPC flow description (DnD): DnD operation started inside guest and
+             *  guest reports DnD content mime-type list. Host side picks up one
+             *  of the formats and requests data in this format. Guest sends
+             *  data in requested format. */
+            const flow_t GHDragFlow[4] =
+            {
+                { VBOX_FORMATS, FLOW_DIRECTION_SERVER },
+                { VBOX_FORMAT,  FLOW_DIRECTION_CLIENT },
+                { VBOX_DATA,    FLOW_DIRECTION_SERVER },
+                { CMD_MAX,      false }
+            };
+
+            /** IPC flow description (DnD): DnD operation started on host and
+             *  host reports DnD content mime-type list. Guest side picks up one
+             *  of the formats and requests data in this format. Host sends
+             *  data in requested format. */
+            const flow_t HGDragFlow[4] =
+            {
+                { VBOX_FORMATS, FLOW_DIRECTION_CLIENT },
+                { VBOX_FORMAT,  FLOW_DIRECTION_SERVER },
+                { VBOX_DATA,    FLOW_DIRECTION_CLIENT },
                 { CMD_MAX,      false }
             };
