Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
waypipe(1)		    General Commands Manual		    waypipe(1)

NAME
       waypipe - A transparent proxy for Wayland applications

SYNOPSIS
       waypipe [options...] ssh	[ssh options] destination command...

       waypipe [options...] client
       waypipe [options...] server -- command...
       waypipe bench
       waypipe [--version] [-h,	--help]

       [options...]  =	[-c,  --compress  C] [-d, --debug] [-n,	--no-gpu] [-o,
       --oneshot] [-s, --socket	S] [--display D] [--drm-node R]	[--remote-node
       R] [--remote-bin	R] [--remote-socket S] [--login-shell]	[--threads  T]
       [--title-prefix P] [--unlink-socket] [--video V]	[--vsock] [--secctx S]

DESCRIPTION
       Waypipe	is a proxy for Wayland clients,	with the aim of	supporting be-
       havior like ssh -X.

       Prefixing an ssh	... command to become waypipe ssh ...  will  automati-
       cally run waypipe both locally and remotely, and	modify the ssh command
       to  set	up forwarding between the two instances	of waypipe. The	remote
       instance	will act like a	Wayland	compositor, letting  Wayland  applica-
       tions that are run remotely be displayed	locally.

       When  run  as  waypipe  client,	it  will  open a socket	(by default at
       /tmp/waypipe-client.sock) and will connect to the local Wayland compos-
       itor and	forward	all Wayland applications which were linked to it  over
       the socket by a matching	waypipe	server instance.

       When run	as waypipe server, it will run the command that	follows	in its
       command	line invocation, set up	its own	Wayland	compositor socket, and
       try to connect to  its  matching	 waypipe  client  socket  (by  default
       /tmp/waypipe-server.sock)  and  try  to forward all the Wayland clients
       that connect to fake compositor socket to the matching waypipe client.

       The waypipe bench mode can be used to estimate  which  compression  op-
       tions  produce the lowest latency, for a	given connection bandwidth and
       number of threads. It tests  two	 synthetic  images,  one  made	to  be
       roughly	as  compressible as images containing text, and	one made to be
       roughly as compressible as images containing pictures.

OPTIONS
       -c C, --compress	C
	   Select the compression method applied to  data  transfers.  Options
	   are	none  (for  high-bandwidth networks), lz4 (intermediate), zstd
	   (slow connection). The default compression is lz4.  The compression
	   level can be	chosen by appending = followed by a number. For	 exam-
	   ple,	if C is	zstd=7,	waypipe	will use level 7 Zstd compression.

	       Unless  waypipe is built	without	LZ4 support, in	which case the
	   default compression will be none.

       -d, --debug
	   Print debug log messages.

       -h, --help
	   Show	help message and quit.

       -n, --no-gpu
	   Block protocols like	wayland-drm and	linux-dmabuf which require ac-
	   cess	to e.g.	render nodes.

       -o, --oneshot
	   Only	permit a single	connection, and	exit when it is	closed.

       -s S, --socket S
	   Use S as the	path for the Unix socket. The default socket path  for
	   server  mode	 is  /tmp/waypipe-server.sock;	for client mode, it is
	   /tmp/waypipe-client.sock; and in ssh	mode, S	gives the prefix  used
	   by  both the	client and the server for their	socket paths. (The ac-
	   tual	socket paths in	ssh mode add a randomized suffix  to  S.)  The
	   default prefix in ssh mode is /tmp/waypipe.

	   When	vsock is enabled use S to specify a CID	and a port number.

       --version
	   Briefly  describe  Waypipe's	 version and the features it was built
	   with, then quit. Possible features: LZ4 compression	support,  ZSTD
	   compression support,	ability	to transfer DMABUFs, video compression
	   support.

       --display D
	   For	server	or  ssh	 mode, provide WAYLAND_DISPLAY and let waypipe
	   configure its Wayland display socket	to have	a matching path. (If D
	   is not an absolute path, the	socket will be created in  the	folder
	   given by the	environment variable XDG_RUNTIME_DIR.)

       --drm-node R
	   Specify  the	path R to the drm device that this instance of waypipe
	   should use and (in  server  mode)  notify  connecting  applications
	   about.

       --remote-node R
	   In  ssh  mode, specify the path R to	the drm	device that the	remote
	   instance of waypipe (running	in server mode)	should use.

       --remote-bin R
	   In ssh mode,	specify	the path R to the waypipe binary on the	remote
	   computer, or	its name if it is available in PATH.  It  defaults  to
	   waypipe if this option isnt passed.

       --remote-socket R
	   In  ssh  mode, specify the prefix used by the remote	waypipe	server
	   for its socket path.	This overrides the  --socket  option,  on  the
	   server side only.

       --login-shell
	   Only	 for  server  mode;  if	 no command is being run, open a login
	   shell.

       --threads T
	   Set the number of total threads (including the main thread) which a
	   waypipe instance will create. These threads will be used to	paral-
	   lelize  compression	operations.  This flag is passed on to waypipe
	   server when given to	waypipe	ssh. The flag also controls the	thread
	   count for waypipe bench. The	default	behavior (choosable by setting
	   T to	0) is to use half as many threads as the computer has hardware
	   threads available.

       --title-prefix P
	   Prepend P to	any window titles specified using the XDG shell	proto-
	   col.	In ssh mode, the prefix	is applied only	on the client side.

       --unlink-socket
	   Only	for server mode; on shutdown,  unlink  the  Unix  socket  that
	   waypipe connects to.

       --video V
	   Compress specific DMABUF formats using a lossy video	codec. Opaque,
	   10-bit, and multiplanar formats, among others, are not supported. V
	   is a	comma separated	list of	options	to control the video encoding.
	   (For	 example:  --video  av1,hw.)  Later  options supersede earlier
	   ones.

	   none
	       Do not use video	encoding.

	   h264
	       Use H.264 encoded video.

	   vp9
	       Use VP9 encoded video.

	   av1
	       Use VP9 encoded video.

	   sw, swenc, swdec
	       Use software encoding or	decoding, when available.

	   hw, hwenc, hwdec
	       Use hardware encoding or	decoding, when available.

	   bpf=B
	       Set the target bit rate of the video encoder, in	units of  bits
	       per  frame.  B can be written as	an integer or with exponential
	       notation;   thus	   --video=bpf=7.5e5	is    equivalent    to
	       --video=bpf=750000.

       --vsock
	   Use	vsock  instead	of  unix sockets. This is used when waypipe is
	   running in virtual machines.	With this option enabled specify a CID
	   and a port number in	S. CID is only used in the server mode and can
	   be omitted when connecting from a guest virtual machine to host.

       --secctx	S
	   Enable the Wayland security context protocol	(client	or ssh modes).
	   Specify an application ID S that will be attached to	 the  security
	   context.

       --control C
       --hwvideo
       --allow-tiled
	   Options present in older versions of	Waypipe	that were removed.

EXAMPLE
       The  following waypipe ssh subcommand will attempt to run weston-flower
       on the server exserv, displaying	the result on the local	system.

		waypipe	ssh user@exserv	weston-flower

       One can obtain similar behavior by explicitly running waypipe and ssh:

		waypipe	--socket /tmp/socket-client client  &
		ssh -R /tmp/socket-server:/tmp/socket-client user@exserv \
		     waypipe --socket /tmp/socket-server server	-- weston-flower
		kill %1

       Waypipe may be run locally without  an  SSH  connection	by  specifying
       matching	socket paths. For example:

		waypipe	--socket /tmp/waypipe.sock client &
		waypipe	--socket /tmp/waypipe.sock server weston-simple-dmabuf-egl
		kill %1
		rm /tmp/waypipe.sock

       Using  transports  other	 than  SSH is a	bit more complicated. A	recipe
       with ncat to connect to remote from computer local:

	       $ waypipe --socket /tmp/waypipe-remote.sock client &
	       $ ncat --ssl -lk	12345 --sh-exec	'ncat -U /tmp/waypipe-remote.sock' &
	       $ ssh user@remote

	       > ncat -lkU /tmp/waypipe-local.sock --sh-exec 'ncat --ssl local 12345' &
	       > waypipe --display wayland-local \
			   --socket /tmp/waypipe-local.sock server -- sleep inf	&
	       > WAYLAND_DISPLAY=wayland-local application

       Given a certificate file, socat can also	provide	an  encrypted  connec-
       tion (remove 'verify=0' to check	certificates):

	       $ waypipe --socket /tmp/waypipe-remote.sock client &
	       $ socat openssl-listen:12345,reuseaddr,cert=certificate.pem,verify=0,fork \
		   unix-connect:/tmp/waypipe-remote.sock
	       $ ssh user@remote

	       > socat unix-listen:/tmp/waypipe-local.sock,reuseaddr,fork \
		   openssl-connect:local:12345,verify=0	&
	       > waypipe --socket /tmp/waypipe-local.sock server -- application

       Many applications require specific environment variables	to use Wayland
       instead of X11. If ssh isn't configured to support loading ~/.ssh/envi-
       ronment,	  or   to   allow  specific  variables	to  be	set  with  Ac-
       ceptEnv/SetEnv, one can run waypipe ssh without a command (and  thereby
       open a login shell), or use env to set the needed variables each	time:

		 waypipe ssh user@host env XDG_SESSION_TYPE=wayland dolphin

       In  some	cases, one may wish to set environment variables for the wayp-
       ipe server process itself; the above trick with env will	not  do	 this,
       because	the  env  process  will	 be a child of waypipe server, not the
       other way around. Instead, one can use ~/.ssh/environment, or  use  the
       --remote-bin  option  to	 change	the remote Waypipe instance to a shell
       script that sets	the environment	before running the actual waypipe pro-
       gram.

   Running waypipe in virtual machines
       When running waypipe in virtual machines	on the same host it is	possi-
       ble  to	use  vsock for efficient inter-vm communication. The following
       scenarios are supported:

          Running applications	on host	from guest.

		host> waypipe --vsock -s 1234 client
		guest> waypipe --vsock -s 1234 server weston-terminal

          Running applications	in a guest virtual machine from	host.

		guest> waypipe --vsock -s 1234 client
		host> waypipe --vsock -s 3:1234	server weston-terminal

       In this example waypipe server connects to a virtual machine with CID 3
       on port 1234.

          Running applications	in a guest virtual machine  from  other	 guest
	   virtual  machines.  When  running both client and server in virtual
	   machines it is possble to enable the	VMADDR_FLAG_TO_HOST  flag  for
	   sibling communication by prefixing the CID with an s:

		guest> waypipe --vsock -s 1234 client
		guest> waypipe --vsock -s s3:1234 server weston-terminal

       In  this	case all packets will be routed	to host	where they can be for-
       warded to another virtual machine with a	vhost-device-vsock  device  or
       some other utility.

ENVIRONMENT
       When  running  as  a server, by default WAYLAND_DISPLAY will be set for
       the invoked process.

       If the --oneshot	flag is	set, waypipe will instead  set	WAYLAND_SOCKET
       and  inherit an already connected socketpair file descriptor to the in-
       voked (child) process. Some programs open and close a  Wayland  connec-
       tion repeatedly as part of their	initialization,	and will not work cor-
       rectly with this	flag.

EXIT STATUS
       waypipe	ssh  will  exit	with the exit status code from the remote com-
       mand, or	with return code 1 if there has	been an	error.

SECURITY
       Waypipe does not	provide	any strong security guarantees,	and connecting
       to untrusted servers is not recommended.	It does	not filter which  Way-
       land protocols the compositor makes available to	the client (with a few
       exceptions  for	protocols  that	require	file descriptors which Waypipe
       cannot yet handle). For example,	if a Wayland compositor	gives all  its
       clients	access	to  a screenshot or lock-screen	protocol, then proxied
       clients run under Waypipe can also make screenshots or lock the screen.

       In general, applications	are not	well tested against malicious composi-
       tors, and compositors are not well tested  against  malicious  clients.
       Waypipe	can connect the	two, and may blindly forward denial-of-service
       and other attacks.

       Waypipe itself is written in C and links	to compression,	graphics,  and
       video  libraries;  both	it and these libraries may have	security bugs.
       Some risk can be	avoided	by building Waypipe with DMABUF	support	turned
       off, or running Waypipe with the	--no-gpu flag so that it does not  ex-
       pose graphics libraries.

       waypipe	ssh has	no explicit protections	against	timing attacks;	an ob-
       server to the resulting network traffic may, by studying	the  size  and
       timing  of packets, learn information about the user's interaction with
       a Wayland client	proxied	through	waypipe	ssh. For example:  a  lack  of
       activity	 suggests  the	user  is  not currently	using the application,
       while an	intermittant stream of messages	from  the  compositor  to  the
       client  may  indicate mouse movement (or	maybe something	else: the con-
       tents of	the messages are protected by ssh.)

       The memory used by Waypipe processes may, at a given time, include Way-
       land messages encoding user input, and the contents of current and  re-
       cent  frames drawn for application windows. Swap	should be encrypted to
       prevent this data from being leaked to disk.

BUGS
       File bug	reports	at: https://gitlab.freedesktop.org/mstoeckl/waypipe/

   Common issues
       Some programs (gnome-terminal, firefox, kate, among others)  have  spe-
       cial  mechanisms	 to ensure that	only one process is running at a time.
       Starting	those programs under Waypipe while they	are  running  under  a
       different  Wayland  compositor may silently open	a window or tab	in the
       original	instance of the	program. Such programs may have	a command line
       argument	to create a new	instance.

       The waypipe ssh command requires	that the ssh executable	supports  Unix
       socket  forwarding; this	is only	supported in OpenSSH since version 6.7
       (from 2014), and	may require specific configuration. Other  implementa-
       tions  of  SSH may not be able to forward Unix sockets; see the EXAMPLE
       section above for how to	use non-SSH transports.

SEE ALSO
       weston(1), ssh(1), socat(1), ncat(1)

				  2025-11-02			    waypipe(1)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=waypipe&sektion=1&manpath=FreeBSD+Ports+15.0>

home | help