[PATCH 1/3] um: Remove obsolete legacy network transports

Anton Ivanov anton.ivanov at cambridgegreys.com
Sat May 3 06:25:46 PDT 2025


On 03/05/2025 06:17, Tiwei Bie wrote:
> These legacy network transports were marked as obsolete in commit
> 40814b98a570 ("um: Mark non-vector net transports as obsolete").
> More than five years have passed since then. Remove these network
> transports to reduce the maintenance burden.
> 
> Suggested-by: Anton Ivanov <anton.ivanov at cambridgegreys.com>
> Signed-off-by: Tiwei Bie <tiwei.btw at antgroup.com>
> ---
>   .../virt/uml/user_mode_linux_howto_v2.rst     |  31 +--
>   arch/um/configs/i386_defconfig                |   6 -
>   arch/um/configs/x86_64_defconfig              |   6 -
>   arch/um/drivers/Kconfig                       | 170 ------------
>   arch/um/drivers/Makefile                      |  18 +-
>   arch/um/drivers/daemon.h                      |  29 --
>   arch/um/drivers/daemon_kern.c                 |  95 -------
>   arch/um/drivers/daemon_user.c                 | 194 --------------
>   arch/um/drivers/slip.h                        |  21 --
>   arch/um/drivers/slip_common.c                 |  55 ----
>   arch/um/drivers/slip_common.h                 | 106 --------
>   arch/um/drivers/slip_kern.c                   |  93 -------
>   arch/um/drivers/slip_user.c                   | 252 ------------------
>   arch/um/drivers/slirp.h                       |  34 ---
>   arch/um/drivers/slirp_kern.c                  | 120 ---------
>   arch/um/drivers/slirp_user.c                  | 124 ---------
>   arch/um/drivers/umcast.h                      |  27 --
>   arch/um/drivers/umcast_kern.c                 | 188 -------------
>   arch/um/drivers/umcast_user.c                 | 184 -------------
>   arch/um/drivers/vde.h                         |  32 ---
>   arch/um/drivers/vde_kern.c                    | 129 ---------
>   arch/um/drivers/vde_user.c                    | 125 ---------
>   arch/um/include/shared/os.h                   |   1 -
>   arch/um/os-Linux/Makefile                     |   2 +-
>   arch/um/os-Linux/drivers/Makefile             |  13 -
>   arch/um/os-Linux/drivers/etap.h               |  21 --
>   arch/um/os-Linux/drivers/ethertap_kern.c      | 100 -------
>   arch/um/os-Linux/drivers/ethertap_user.c      | 248 -----------------
>   arch/um/os-Linux/drivers/tuntap.h             |  21 --
>   arch/um/os-Linux/drivers/tuntap_kern.c        |  86 ------
>   arch/um/os-Linux/drivers/tuntap_user.c        | 215 ---------------
>   arch/um/os-Linux/file.c                       |  15 --
>   32 files changed, 4 insertions(+), 2757 deletions(-)
>   delete mode 100644 arch/um/drivers/daemon.h
>   delete mode 100644 arch/um/drivers/daemon_kern.c
>   delete mode 100644 arch/um/drivers/daemon_user.c
>   delete mode 100644 arch/um/drivers/slip.h
>   delete mode 100644 arch/um/drivers/slip_common.c
>   delete mode 100644 arch/um/drivers/slip_common.h
>   delete mode 100644 arch/um/drivers/slip_kern.c
>   delete mode 100644 arch/um/drivers/slip_user.c
>   delete mode 100644 arch/um/drivers/slirp.h
>   delete mode 100644 arch/um/drivers/slirp_kern.c
>   delete mode 100644 arch/um/drivers/slirp_user.c
>   delete mode 100644 arch/um/drivers/umcast.h
>   delete mode 100644 arch/um/drivers/umcast_kern.c
>   delete mode 100644 arch/um/drivers/umcast_user.c
>   delete mode 100644 arch/um/drivers/vde.h
>   delete mode 100644 arch/um/drivers/vde_kern.c
>   delete mode 100644 arch/um/drivers/vde_user.c
>   delete mode 100644 arch/um/os-Linux/drivers/Makefile
>   delete mode 100644 arch/um/os-Linux/drivers/etap.h
>   delete mode 100644 arch/um/os-Linux/drivers/ethertap_kern.c
>   delete mode 100644 arch/um/os-Linux/drivers/ethertap_user.c
>   delete mode 100644 arch/um/os-Linux/drivers/tuntap.h
>   delete mode 100644 arch/um/os-Linux/drivers/tuntap_kern.c
>   delete mode 100644 arch/um/os-Linux/drivers/tuntap_user.c
> 
> diff --git a/Documentation/virt/uml/user_mode_linux_howto_v2.rst b/Documentation/virt/uml/user_mode_linux_howto_v2.rst
> index 584000b743f3..60f35ed748b2 100644
> --- a/Documentation/virt/uml/user_mode_linux_howto_v2.rst
> +++ b/Documentation/virt/uml/user_mode_linux_howto_v2.rst
> @@ -219,16 +219,6 @@ remote UML and other VM instances.
>   +-----------+--------+------------------------------------+------------+
>   | vde       | vector | dep. on VDE VPN: Virt.Net Locator  | varies     |
>   +-----------+--------+------------------------------------+------------+
> -| tuntap    | legacy | none                               | ~ 500Mbit  |
> -+-----------+--------+------------------------------------+------------+
> -| daemon    | legacy | none                               | ~ 450Mbit  |
> -+-----------+--------+------------------------------------+------------+
> -| socket    | legacy | none                               | ~ 450Mbit  |
> -+-----------+--------+------------------------------------+------------+
> -| ethertap  | legacy | obsolete                           | ~ 500Mbit  |
> -+-----------+--------+------------------------------------+------------+
> -| vde       | legacy | obsolete                           | ~ 500Mbit  |
> -+-----------+--------+------------------------------------+------------+
>   
>   * All transports which have tso and checksum offloads can deliver speeds
>     approaching 10G on TCP streams.
> @@ -236,27 +226,16 @@ remote UML and other VM instances.
>   * All transports which have multi-packet rx and/or tx can deliver pps
>     rates of up to 1Mps or more.
>   
> -* All legacy transports are generally limited to ~600-700MBit and 0.05Mps.
> -
>   * GRE and L2TPv3 allow connections to all of: local machine, remote
>     machines, remote network devices and remote UML instances.
>   
> -* Socket allows connections only between UML instances.
> -
> -* Daemon and bess require running a local switch. This switch may be
> -  connected to the host as well.
> -
>   
>   Network configuration privileges
>   ================================
>   
>   The majority of the supported networking modes need ``root`` privileges.
> -For example, in the legacy tuntap networking mode, users were required
> -to be part of the group associated with the tunnel device.
> -
> -For newer network drivers like the vector transports, ``root`` privilege
> -is required to fire an ioctl to setup the tun interface and/or use
> -raw sockets where needed.
> +For example, for vector transports, ``root`` privilege is required to fire
> +an ioctl to setup the tun interface and/or use raw sockets where needed.
>   
>   This can be achieved by granting the user a particular capability instead
>   of running UML as root.  In case of vector transport, a user can add the
> @@ -610,12 +589,6 @@ connect to a local area cloud (all the UML nodes using the same
>   multicast address running on hosts in the same multicast domain (LAN)
>   will be automagically connected together to a virtual LAN.
>   
> -Configuring Legacy transports
> -=============================
> -
> -Legacy transports are now considered obsolete. Please use the vector
> -versions.
> -
>   ***********
>   Running UML
>   ***********
> diff --git a/arch/um/configs/i386_defconfig b/arch/um/configs/i386_defconfig
> index 1ffa088739f4..7c8999f18f2d 100644
> --- a/arch/um/configs/i386_defconfig
> +++ b/arch/um/configs/i386_defconfig
> @@ -53,12 +53,6 @@ CONFIG_UNIX=y
>   CONFIG_INET=y
>   # CONFIG_IPV6 is not set
>   CONFIG_UML_NET=y
> -CONFIG_UML_NET_ETHERTAP=y
> -CONFIG_UML_NET_TUNTAP=y
> -CONFIG_UML_NET_SLIP=y
> -CONFIG_UML_NET_DAEMON=y
> -CONFIG_UML_NET_MCAST=y
> -CONFIG_UML_NET_SLIRP=y
>   CONFIG_EXT4_FS=y
>   CONFIG_QUOTA=y
>   CONFIG_AUTOFS_FS=m
> diff --git a/arch/um/configs/x86_64_defconfig b/arch/um/configs/x86_64_defconfig
> index 03b10d3f6816..9858d989777e 100644
> --- a/arch/um/configs/x86_64_defconfig
> +++ b/arch/um/configs/x86_64_defconfig
> @@ -52,12 +52,6 @@ CONFIG_UNIX=y
>   CONFIG_INET=y
>   # CONFIG_IPV6 is not set
>   CONFIG_UML_NET=y
> -CONFIG_UML_NET_ETHERTAP=y
> -CONFIG_UML_NET_TUNTAP=y
> -CONFIG_UML_NET_SLIP=y
> -CONFIG_UML_NET_DAEMON=y
> -CONFIG_UML_NET_MCAST=y
> -CONFIG_UML_NET_SLIRP=y
>   CONFIG_EXT4_FS=y
>   CONFIG_QUOTA=y
>   CONFIG_AUTOFS_FS=m
> diff --git a/arch/um/drivers/Kconfig b/arch/um/drivers/Kconfig
> index 9cb196070614..5bf4f0f3fd01 100644
> --- a/arch/um/drivers/Kconfig
> +++ b/arch/um/drivers/Kconfig
> @@ -143,99 +143,6 @@ config UML_NET
>   	  enable at least one of the following transport options to actually
>   	  make use of UML networking.
>   
> -config UML_NET_ETHERTAP
> -	bool "Ethertap transport (obsolete)"
> -	depends on UML_NET
> -	help
> -	  The Ethertap User-Mode Linux network transport allows a single
> -	  running UML to exchange packets with its host over one of the
> -	  host's Ethertap devices, such as /dev/tap0.  Additional running
> -	  UMLs can use additional Ethertap devices, one per running UML.
> -	  While the UML believes it's on a (multi-device, broadcast) virtual
> -	  Ethernet network, it's in fact communicating over a point-to-point
> -	  link with the host.
> -
> -	  To use this, your host kernel must have support for Ethertap
> -	  devices.  Also, if your host kernel is 2.4.x, it must have
> -	  CONFIG_NETLINK_DEV configured as Y or M.
> -
> -	  For more information, see
> -	  <http://user-mode-linux.sourceforge.net/old/networking.html>  That site
> -	  has examples of the UML command line to use to enable Ethertap
> -	  networking.
> -
> -	  NOTE: THIS TRANSPORT IS DEPRECATED AND WILL BE REMOVED SOON!!! Please
> -	  migrate to UML_NET_VECTOR.
> -
> -	  If unsure, say N.
> -
> -config UML_NET_TUNTAP
> -	bool "TUN/TAP transport (obsolete)"
> -	depends on UML_NET
> -	help
> -	  The UML TUN/TAP network transport allows a UML instance to exchange
> -	  packets with the host over a TUN/TAP device.  This option will only
> -	  work with a 2.4 host, unless you've applied the TUN/TAP patch to
> -	  your 2.2 host kernel.
> -
> -	  To use this transport, your host kernel must have support for TUN/TAP
> -	  devices, either built-in or as a module.
> -
> -	  NOTE: THIS TRANSPORT IS DEPRECATED AND WILL BE REMOVED SOON!!! Please
> -	  migrate to UML_NET_VECTOR.
> -
> -	  If unsure, say N.
> -
> -config UML_NET_SLIP
> -	bool "SLIP transport (obsolete)"
> -	depends on UML_NET
> -	help
> -	  The slip User-Mode Linux network transport allows a running UML to
> -	  network with its host over a point-to-point link.  Unlike Ethertap,
> -	  which can carry any Ethernet frame (and hence even non-IP packets),
> -	  the slip transport can only carry IP packets.
> -
> -	  To use this, your host must support slip devices.
> -
> -	  For more information, see
> -	  <http://user-mode-linux.sourceforge.net/old/networking.html>.
> -	  has examples of the UML command line to use to enable slip
> -	  networking, and details of a few quirks with it.
> -
> -	  NOTE: THIS TRANSPORT IS DEPRECATED AND WILL BE REMOVED SOON!!! Please
> -	  migrate to UML_NET_VECTOR.
> -
> -	  If unsure, say N.
> -
> -config UML_NET_DAEMON
> -	bool "Daemon transport (obsolete)"
> -	depends on UML_NET
> -	help
> -	  This User-Mode Linux network transport allows one or more running
> -	  UMLs on a single host to communicate with each other, but not to
> -	  the host.
> -
> -	  To use this form of networking, you'll need to run the UML
> -	  networking daemon on the host.
> -
> -	  For more information, see
> -	  <http://user-mode-linux.sourceforge.net/old/networking.html>  That site
> -	  has examples of the UML command line to use to enable Daemon
> -	  networking.
> -
> -	  NOTE: THIS TRANSPORT IS DEPRECATED AND WILL BE REMOVED SOON!!! Please
> -	  migrate to UML_NET_VECTOR.
> -
> -	  If unsure, say N.
> -
> -config UML_NET_DAEMON_DEFAULT_SOCK
> -	string "Default socket for daemon transport"
> -	default "/tmp/uml.ctl"
> -	depends on UML_NET_DAEMON
> -	help
> -	  This option allows setting the default socket for the daemon
> -	  transport, normally it defaults to /tmp/uml.ctl.
> -
>   config UML_NET_VECTOR
>   	bool "Vector I/O high performance network devices"
>   	depends on UML_NET
> @@ -248,83 +155,6 @@ config UML_NET_VECTOR
>   	  with up to 4 times higher network throughput than the UML network
>   	  drivers.
>   
> -config UML_NET_VDE
> -	bool "VDE transport (obsolete)"
> -	depends on UML_NET
> -	depends on !MODVERSIONS
> -	select MAY_HAVE_RUNTIME_DEPS
> -	help
> -	  This User-Mode Linux network transport allows one or more running
> -	  UMLs on a single host to communicate with each other and also
> -	  with the rest of the world using Virtual Distributed Ethernet,
> -	  an improved fork of uml_switch.
> -
> -	  You must have libvdeplug installed in order to build the vde
> -	  transport into UML.
> -
> -	  To use this form of networking, you will need to run vde_switch
> -	  on the host.
> -
> -	  For more information, see <http://wiki.virtualsquare.org/>
> -	  That site has a good overview of what VDE is and also examples
> -	  of the UML command line to use to enable VDE networking.
> -
> -	  NOTE: THIS TRANSPORT IS DEPRECATED AND WILL BE REMOVED SOON!!! Please
> -	  migrate to UML_NET_VECTOR.
> -
> -	  If unsure, say N.
> -
> -config UML_NET_MCAST
> -	bool "Multicast transport (obsolete)"
> -	depends on UML_NET
> -	help
> -	  This Multicast User-Mode Linux network transport allows multiple
> -	  UMLs (even ones running on different host machines!) to talk to
> -	  each other over a virtual ethernet network.  However, it requires
> -	  at least one UML with one of the other transports to act as a
> -	  bridge if any of them need to be able to talk to their hosts or any
> -	  other IP machines.
> -
> -	  To use this, your host kernel(s) must support IP Multicasting.
> -
> -	  For more information, see
> -	  <http://user-mode-linux.sourceforge.net/old/networking.html>  That site
> -	  has examples of the UML command line to use to enable Multicast
> -	  networking, and notes about the security of this approach.
> -
> -	  NOTE: THIS TRANSPORT IS DEPRECATED AND WILL BE REMOVED SOON!!! Please
> -	  migrate to UML_NET_VECTOR.
> -
> -	  If unsure, say N.
> -
> -config UML_NET_SLIRP
> -	bool "SLiRP transport (obsolete)"
> -	depends on UML_NET
> -	help
> -	  The SLiRP User-Mode Linux network transport allows a running UML
> -	  to network by invoking a program that can handle SLIP encapsulated
> -	  packets.  This is commonly (but not limited to) the application
> -	  known as SLiRP, a program that can re-socket IP packets back onto
> -	  he host on which it is run.  Only IP packets are supported,
> -	  unlike other network transports that can handle all Ethernet
> -	  frames.  In general, slirp allows the UML the same IP connectivity
> -	  to the outside world that the host user is permitted, and unlike
> -	  other transports, SLiRP works without the need of root level
> -	  privileges, setuid binaries, or SLIP devices on the host.  This
> -	  also means not every type of connection is possible, but most
> -	  situations can be accommodated with carefully crafted slirp
> -	  commands that can be passed along as part of the network device's
> -	  setup string.  The effect of this transport on the UML is similar
> -	  that of a host behind a firewall that masquerades all network
> -	  connections passing through it (but is less secure).
> -
> -	  NOTE: THIS TRANSPORT IS DEPRECATED AND WILL BE REMOVED SOON!!! Please
> -	  migrate to UML_NET_VECTOR.
> -
> -	  If unsure, say N.
> -
> -	  Startup example: "eth0=slirp,FE:FD:01:02:03:04,/usr/local/bin/slirp"
> -
>   endmenu
>   
>   config VIRTIO_UML
> diff --git a/arch/um/drivers/Makefile b/arch/um/drivers/Makefile
> index 0a5820343ad3..d0608850833c 100644
> --- a/arch/um/drivers/Makefile
> +++ b/arch/um/drivers/Makefile
> @@ -6,11 +6,7 @@
>   # pcap is broken in 2.5 because kbuild doesn't allow pcap.a to be linked
>   # in to pcap.o
>   
> -slip-objs := slip_kern.o slip_user.o
> -slirp-objs := slirp_kern.o slirp_user.o
> -daemon-objs := daemon_kern.o daemon_user.o
>   vector-objs := vector_kern.o vector_user.o vector_transports.o
> -umcast-objs := umcast_kern.o umcast_user.o
>   net-objs := net_kern.o net_user.o
>   mconsole-objs := mconsole_kern.o mconsole_user.o
>   hostaudio-objs := hostaudio_kern.o
> @@ -20,13 +16,6 @@ harddog-objs := harddog_kern.o
>   harddog-builtin-$(CONFIG_UML_WATCHDOG) := harddog_user.o harddog_user_exp.o
>   rtc-objs := rtc_kern.o rtc_user.o
>   
> -LDFLAGS_vde.o = $(shell $(CC) $(CFLAGS) -print-file-name=libvdeplug.a)
> -
> -targets := vde_kern.o vde_user.o
> -
> -$(obj)/vde.o: $(obj)/vde_kern.o $(obj)/vde_user.o
> -	$(LD) -r -dp -o $@ $^ $(ld_flags)
> -
>   #XXX: The call below does not work because the flags are added before the
>   # object name, so nothing from the library gets linked.
>   #$(call if_changed,ld)
> @@ -38,12 +27,7 @@ obj-y := stdio_console.o fd.o chan_kern.o chan_user.o line.o
>   obj-$(CONFIG_SSL) += ssl.o
>   obj-$(CONFIG_STDERR_CONSOLE) += stderr_console.o
>   
> -obj-$(CONFIG_UML_NET_SLIP) += slip.o slip_common.o
> -obj-$(CONFIG_UML_NET_SLIRP) += slirp.o slip_common.o
> -obj-$(CONFIG_UML_NET_DAEMON) += daemon.o
>   obj-$(CONFIG_UML_NET_VECTOR) += vector.o
> -obj-$(CONFIG_UML_NET_VDE) += vde.o
> -obj-$(CONFIG_UML_NET_MCAST) += umcast.o
>   obj-$(CONFIG_UML_NET) += net.o
>   obj-$(CONFIG_MCONSOLE) += mconsole.o
>   obj-$(CONFIG_MMAPPER) += mmapper_kern.o
> @@ -64,7 +48,7 @@ obj-$(CONFIG_UML_PCI) += virt-pci.o
>   obj-$(CONFIG_UML_PCI_OVER_VIRTIO) += virtio_pcidev.o
>   
>   # pcap_user.o must be added explicitly.
> -USER_OBJS := fd.o null.o pty.o tty.o xterm.o slip_common.o vde_user.o vector_user.o
> +USER_OBJS := fd.o null.o pty.o tty.o xterm.o vector_user.o
>   CFLAGS_null.o = -DDEV_NULL=$(DEV_NULL_PATH)
>   
>   CFLAGS_xterm.o += '-DCONFIG_XTERM_CHAN_DEFAULT_EMULATOR="$(CONFIG_XTERM_CHAN_DEFAULT_EMULATOR)"'
> diff --git a/arch/um/drivers/daemon.h b/arch/um/drivers/daemon.h
> deleted file mode 100644
> index 1509cc7eb907..000000000000
> --- a/arch/um/drivers/daemon.h
> +++ /dev/null
> @@ -1,29 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 */
> -/*
> - * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
> - */
> -
> -#ifndef __DAEMON_H__
> -#define __DAEMON_H__
> -
> -#include <net_user.h>
> -
> -#define SWITCH_VERSION 3
> -
> -struct daemon_data {
> -	char *sock_type;
> -	char *ctl_sock;
> -	void *ctl_addr;
> -	void *data_addr;
> -	void *local_addr;
> -	int fd;
> -	int control;
> -	void *dev;
> -};
> -
> -extern const struct net_user_info daemon_user_info;
> -
> -extern int daemon_user_write(int fd, void *buf, int len,
> -			     struct daemon_data *pri);
> -
> -#endif
> diff --git a/arch/um/drivers/daemon_kern.c b/arch/um/drivers/daemon_kern.c
> deleted file mode 100644
> index afde1e82c056..000000000000
> --- a/arch/um/drivers/daemon_kern.c
> +++ /dev/null
> @@ -1,95 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * Copyright (C) 2001 Lennert Buytenhek (buytenh at gnu.org) and
> - * James Leu (jleu at mindspring.net).
> - * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
> - * Copyright (C) 2001 by various other people who didn't put their name here.
> - */
> -
> -#include <linux/init.h>
> -#include <linux/netdevice.h>
> -#include <net_kern.h>
> -#include "daemon.h"
> -
> -struct daemon_init {
> -	char *sock_type;
> -	char *ctl_sock;
> -};
> -
> -static void daemon_init(struct net_device *dev, void *data)
> -{
> -	struct uml_net_private *pri;
> -	struct daemon_data *dpri;
> -	struct daemon_init *init = data;
> -
> -	pri = netdev_priv(dev);
> -	dpri = (struct daemon_data *) pri->user;
> -	dpri->sock_type = init->sock_type;
> -	dpri->ctl_sock = init->ctl_sock;
> -	dpri->fd = -1;
> -	dpri->control = -1;
> -	dpri->dev = dev;
> -	/* We will free this pointer. If it contains crap we're burned. */
> -	dpri->ctl_addr = NULL;
> -	dpri->data_addr = NULL;
> -	dpri->local_addr = NULL;
> -
> -	printk("daemon backend (uml_switch version %d) - %s:%s",
> -	       SWITCH_VERSION, dpri->sock_type, dpri->ctl_sock);
> -	printk("\n");
> -}
> -
> -static int daemon_read(int fd, struct sk_buff *skb, struct uml_net_private *lp)
> -{
> -	return net_recvfrom(fd, skb_mac_header(skb),
> -			    skb->dev->mtu + ETH_HEADER_OTHER);
> -}
> -
> -static int daemon_write(int fd, struct sk_buff *skb, struct uml_net_private *lp)
> -{
> -	return daemon_user_write(fd, skb->data, skb->len,
> -				 (struct daemon_data *) &lp->user);
> -}
> -
> -static const struct net_kern_info daemon_kern_info = {
> -	.init			= daemon_init,
> -	.protocol		= eth_protocol,
> -	.read			= daemon_read,
> -	.write			= daemon_write,
> -};
> -
> -static int daemon_setup(char *str, char **mac_out, void *data)
> -{
> -	struct daemon_init *init = data;
> -	char *remain;
> -
> -	*init = ((struct daemon_init)
> -		{ .sock_type 		= "unix",
> -		  .ctl_sock 		= CONFIG_UML_NET_DAEMON_DEFAULT_SOCK });
> -
> -	remain = split_if_spec(str, mac_out, &init->sock_type, &init->ctl_sock,
> -			       NULL);
> -	if (remain != NULL)
> -		printk(KERN_WARNING "daemon_setup : Ignoring data socket "
> -		       "specification\n");
> -
> -	return 1;
> -}
> -
> -static struct transport daemon_transport = {
> -	.list 		= LIST_HEAD_INIT(daemon_transport.list),
> -	.name 		= "daemon",
> -	.setup  	= daemon_setup,
> -	.user 		= &daemon_user_info,
> -	.kern 		= &daemon_kern_info,
> -	.private_size 	= sizeof(struct daemon_data),
> -	.setup_size 	= sizeof(struct daemon_init),
> -};
> -
> -static int register_daemon(void)
> -{
> -	register_transport(&daemon_transport);
> -	return 0;
> -}
> -
> -late_initcall(register_daemon);
> diff --git a/arch/um/drivers/daemon_user.c b/arch/um/drivers/daemon_user.c
> deleted file mode 100644
> index 785baedc3555..000000000000
> --- a/arch/um/drivers/daemon_user.c
> +++ /dev/null
> @@ -1,194 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
> - * Copyright (C) 2001 Lennert Buytenhek (buytenh at gnu.org) and
> - * James Leu (jleu at mindspring.net).
> - * Copyright (C) 2001 by various other people who didn't put their name here.
> - */
> -
> -#include <stdint.h>
> -#include <string.h>
> -#include <unistd.h>
> -#include <errno.h>
> -#include <sys/types.h>
> -#include <sys/socket.h>
> -#include <sys/time.h>
> -#include <sys/un.h>
> -#include "daemon.h"
> -#include <net_user.h>
> -#include <os.h>
> -#include <um_malloc.h>
> -
> -enum request_type { REQ_NEW_CONTROL };
> -
> -#define SWITCH_MAGIC 0xfeedface
> -
> -struct request_v3 {
> -	uint32_t magic;
> -	uint32_t version;
> -	enum request_type type;
> -	struct sockaddr_un sock;
> -};
> -
> -static struct sockaddr_un *new_addr(void *name, int len)
> -{
> -	struct sockaddr_un *sun;
> -
> -	sun = uml_kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL);
> -	if (sun == NULL) {
> -		printk(UM_KERN_ERR "new_addr: allocation of sockaddr_un "
> -		       "failed\n");
> -		return NULL;
> -	}
> -	sun->sun_family = AF_UNIX;
> -	memcpy(sun->sun_path, name, len);
> -	return sun;
> -}
> -
> -static int connect_to_switch(struct daemon_data *pri)
> -{
> -	struct sockaddr_un *ctl_addr = pri->ctl_addr;
> -	struct sockaddr_un *local_addr = pri->local_addr;
> -	struct sockaddr_un *sun;
> -	struct request_v3 req;
> -	int fd, n, err;
> -
> -	pri->control = socket(AF_UNIX, SOCK_STREAM, 0);
> -	if (pri->control < 0) {
> -		err = -errno;
> -		printk(UM_KERN_ERR "daemon_open : control socket failed, "
> -		       "errno = %d\n", -err);
> -		return err;
> -	}
> -
> -	if (connect(pri->control, (struct sockaddr *) ctl_addr,
> -		   sizeof(*ctl_addr)) < 0) {
> -		err = -errno;
> -		printk(UM_KERN_ERR "daemon_open : control connect failed, "
> -		       "errno = %d\n", -err);
> -		goto out;
> -	}
> -
> -	fd = socket(AF_UNIX, SOCK_DGRAM, 0);
> -	if (fd < 0) {
> -		err = -errno;
> -		printk(UM_KERN_ERR "daemon_open : data socket failed, "
> -		       "errno = %d\n", -err);
> -		goto out;
> -	}
> -	if (bind(fd, (struct sockaddr *) local_addr, sizeof(*local_addr)) < 0) {
> -		err = -errno;
> -		printk(UM_KERN_ERR "daemon_open : data bind failed, "
> -		       "errno = %d\n", -err);
> -		goto out_close;
> -	}
> -
> -	sun = uml_kmalloc(sizeof(struct sockaddr_un), UM_GFP_KERNEL);
> -	if (sun == NULL) {
> -		printk(UM_KERN_ERR "new_addr: allocation of sockaddr_un "
> -		       "failed\n");
> -		err = -ENOMEM;
> -		goto out_close;
> -	}
> -
> -	req.magic = SWITCH_MAGIC;
> -	req.version = SWITCH_VERSION;
> -	req.type = REQ_NEW_CONTROL;
> -	req.sock = *local_addr;
> -	n = write(pri->control, &req, sizeof(req));
> -	if (n != sizeof(req)) {
> -		printk(UM_KERN_ERR "daemon_open : control setup request "
> -		       "failed, err = %d\n", -errno);
> -		err = -ENOTCONN;
> -		goto out_free;
> -	}
> -
> -	n = read(pri->control, sun, sizeof(*sun));
> -	if (n != sizeof(*sun)) {
> -		printk(UM_KERN_ERR "daemon_open : read of data socket failed, "
> -		       "err = %d\n", -errno);
> -		err = -ENOTCONN;
> -		goto out_free;
> -	}
> -
> -	pri->data_addr = sun;
> -	return fd;
> -
> - out_free:
> -	kfree(sun);
> - out_close:
> -	close(fd);
> - out:
> -	close(pri->control);
> -	return err;
> -}
> -
> -static int daemon_user_init(void *data, void *dev)
> -{
> -	struct daemon_data *pri = data;
> -	struct timeval tv;
> -	struct {
> -		char zero;
> -		int pid;
> -		int usecs;
> -	} name;
> -
> -	if (!strcmp(pri->sock_type, "unix"))
> -		pri->ctl_addr = new_addr(pri->ctl_sock,
> -					 strlen(pri->ctl_sock) + 1);
> -	name.zero = 0;
> -	name.pid = os_getpid();
> -	gettimeofday(&tv, NULL);
> -	name.usecs = tv.tv_usec;
> -	pri->local_addr = new_addr(&name, sizeof(name));
> -	pri->dev = dev;
> -	pri->fd = connect_to_switch(pri);
> -	if (pri->fd < 0) {
> -		kfree(pri->local_addr);
> -		pri->local_addr = NULL;
> -		return pri->fd;
> -	}
> -
> -	return 0;
> -}
> -
> -static int daemon_open(void *data)
> -{
> -	struct daemon_data *pri = data;
> -	return pri->fd;
> -}
> -
> -static void daemon_remove(void *data)
> -{
> -	struct daemon_data *pri = data;
> -
> -	close(pri->fd);
> -	pri->fd = -1;
> -	close(pri->control);
> -	pri->control = -1;
> -
> -	kfree(pri->data_addr);
> -	pri->data_addr = NULL;
> -	kfree(pri->ctl_addr);
> -	pri->ctl_addr = NULL;
> -	kfree(pri->local_addr);
> -	pri->local_addr = NULL;
> -}
> -
> -int daemon_user_write(int fd, void *buf, int len, struct daemon_data *pri)
> -{
> -	struct sockaddr_un *data_addr = pri->data_addr;
> -
> -	return net_sendto(fd, buf, len, data_addr, sizeof(*data_addr));
> -}
> -
> -const struct net_user_info daemon_user_info = {
> -	.init		= daemon_user_init,
> -	.open		= daemon_open,
> -	.close	 	= NULL,
> -	.remove	 	= daemon_remove,
> -	.add_address	= NULL,
> -	.delete_address = NULL,
> -	.mtu		= ETH_MAX_PACKET,
> -	.max_packet	= ETH_MAX_PACKET + ETH_HEADER_OTHER,
> -};
> diff --git a/arch/um/drivers/slip.h b/arch/um/drivers/slip.h
> deleted file mode 100644
> index 0f3b7ca99465..000000000000
> --- a/arch/um/drivers/slip.h
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 */
> -#ifndef __UM_SLIP_H
> -#define __UM_SLIP_H
> -
> -#include "slip_common.h"
> -
> -struct slip_data {
> -	void *dev;
> -	char name[sizeof("slnnnnn\0")];
> -	char *addr;
> -	char *gate_addr;
> -	int slave;
> -	struct slip_proto slip;
> -};
> -
> -extern const struct net_user_info slip_user_info;
> -
> -extern int slip_user_read(int fd, void *buf, int len, struct slip_data *pri);
> -extern int slip_user_write(int fd, void *buf, int len, struct slip_data *pri);
> -
> -#endif
> diff --git a/arch/um/drivers/slip_common.c b/arch/um/drivers/slip_common.c
> deleted file mode 100644
> index 20fe4f42743d..000000000000
> --- a/arch/um/drivers/slip_common.c
> +++ /dev/null
> @@ -1,55 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -#include <string.h>
> -#include "slip_common.h"
> -#include <net_user.h>
> -
> -int slip_proto_read(int fd, void *buf, int len, struct slip_proto *slip)
> -{
> -	int i, n, size, start;
> -
> -	if(slip->more > 0){
> -		i = 0;
> -		while(i < slip->more){
> -			size = slip_unesc(slip->ibuf[i++], slip->ibuf,
> -					  &slip->pos, &slip->esc);
> -			if(size){
> -				memcpy(buf, slip->ibuf, size);
> -				memmove(slip->ibuf, &slip->ibuf[i],
> -					slip->more - i);
> -				slip->more = slip->more - i;
> -				return size;
> -			}
> -		}
> -		slip->more = 0;
> -	}
> -
> -	n = net_read(fd, &slip->ibuf[slip->pos],
> -		     sizeof(slip->ibuf) - slip->pos);
> -	if(n <= 0)
> -		return n;
> -
> -	start = slip->pos;
> -	for(i = 0; i < n; i++){
> -		size = slip_unesc(slip->ibuf[start + i], slip->ibuf,&slip->pos,
> -				  &slip->esc);
> -		if(size){
> -			memcpy(buf, slip->ibuf, size);
> -			memmove(slip->ibuf, &slip->ibuf[start+i+1],
> -				n - (i + 1));
> -			slip->more = n - (i + 1);
> -			return size;
> -		}
> -	}
> -	return 0;
> -}
> -
> -int slip_proto_write(int fd, void *buf, int len, struct slip_proto *slip)
> -{
> -	int actual, n;
> -
> -	actual = slip_esc(buf, slip->obuf, len);
> -	n = net_write(fd, slip->obuf, actual);
> -	if(n < 0)
> -		return n;
> -	else return len;
> -}
> diff --git a/arch/um/drivers/slip_common.h b/arch/um/drivers/slip_common.h
> deleted file mode 100644
> index d3798b5caf7f..000000000000
> --- a/arch/um/drivers/slip_common.h
> +++ /dev/null
> @@ -1,106 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 */
> -#ifndef __UM_SLIP_COMMON_H
> -#define __UM_SLIP_COMMON_H
> -
> -#define BUF_SIZE 1500
> - /* two bytes each for a (pathological) max packet of escaped chars +  *
> -  * terminating END char + initial END char                            */
> -#define ENC_BUF_SIZE (2 * BUF_SIZE + 2)
> -
> -/* SLIP protocol characters. */
> -#define SLIP_END             0300	/* indicates end of frame	*/
> -#define SLIP_ESC             0333	/* indicates byte stuffing	*/
> -#define SLIP_ESC_END         0334	/* ESC ESC_END means END 'data'	*/
> -#define SLIP_ESC_ESC         0335	/* ESC ESC_ESC means ESC 'data'	*/
> -
> -static inline int slip_unesc(unsigned char c, unsigned char *buf, int *pos,
> -                             int *esc)
> -{
> -	int ret;
> -
> -	switch(c){
> -	case SLIP_END:
> -		*esc = 0;
> -		ret=*pos;
> -		*pos=0;
> -		return(ret);
> -	case SLIP_ESC:
> -		*esc = 1;
> -		return(0);
> -	case SLIP_ESC_ESC:
> -		if(*esc){
> -			*esc = 0;
> -			c = SLIP_ESC;
> -		}
> -		break;
> -	case SLIP_ESC_END:
> -		if(*esc){
> -			*esc = 0;
> -			c = SLIP_END;
> -		}
> -		break;
> -	}
> -	buf[(*pos)++] = c;
> -	return(0);
> -}
> -
> -static inline int slip_esc(unsigned char *s, unsigned char *d, int len)
> -{
> -	unsigned char *ptr = d;
> -	unsigned char c;
> -
> -	/*
> -	 * Send an initial END character to flush out any
> -	 * data that may have accumulated in the receiver
> -	 * due to line noise.
> -	 */
> -
> -	*ptr++ = SLIP_END;
> -
> -	/*
> -	 * For each byte in the packet, send the appropriate
> -	 * character sequence, according to the SLIP protocol.
> -	 */
> -
> -	while (len-- > 0) {
> -		switch(c = *s++) {
> -		case SLIP_END:
> -			*ptr++ = SLIP_ESC;
> -			*ptr++ = SLIP_ESC_END;
> -			break;
> -		case SLIP_ESC:
> -			*ptr++ = SLIP_ESC;
> -			*ptr++ = SLIP_ESC_ESC;
> -			break;
> -		default:
> -			*ptr++ = c;
> -			break;
> -		}
> -	}
> -	*ptr++ = SLIP_END;
> -	return (ptr - d);
> -}
> -
> -struct slip_proto {
> -	unsigned char ibuf[ENC_BUF_SIZE];
> -	unsigned char obuf[ENC_BUF_SIZE];
> -	int more; /* more data: do not read fd until ibuf has been drained */
> -	int pos;
> -	int esc;
> -};
> -
> -static inline void slip_proto_init(struct slip_proto * slip)
> -{
> -	memset(slip->ibuf, 0, sizeof(slip->ibuf));
> -	memset(slip->obuf, 0, sizeof(slip->obuf));
> -	slip->more = 0;
> -	slip->pos = 0;
> -	slip->esc = 0;
> -}
> -
> -extern int slip_proto_read(int fd, void *buf, int len,
> -			   struct slip_proto *slip);
> -extern int slip_proto_write(int fd, void *buf, int len,
> -			    struct slip_proto *slip);
> -
> -#endif
> diff --git a/arch/um/drivers/slip_kern.c b/arch/um/drivers/slip_kern.c
> deleted file mode 100644
> index c58ccdcc16d6..000000000000
> --- a/arch/um/drivers/slip_kern.c
> +++ /dev/null
> @@ -1,93 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * Copyright (C) 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
> - */
> -
> -#include <linux/if_arp.h>
> -#include <linux/init.h>
> -#include <linux/netdevice.h>
> -#include <net_kern.h>
> -#include "slip.h"
> -
> -struct slip_init {
> -	char *gate_addr;
> -};
> -
> -static void slip_init(struct net_device *dev, void *data)
> -{
> -	struct uml_net_private *private;
> -	struct slip_data *spri;
> -	struct slip_init *init = data;
> -
> -	private = netdev_priv(dev);
> -	spri = (struct slip_data *) private->user;
> -
> -	memset(spri->name, 0, sizeof(spri->name));
> -	spri->addr = NULL;
> -	spri->gate_addr = init->gate_addr;
> -	spri->slave = -1;
> -	spri->dev = dev;
> -
> -	slip_proto_init(&spri->slip);
> -
> -	dev->hard_header_len = 0;
> -	dev->header_ops = NULL;
> -	dev->addr_len = 0;
> -	dev->type = ARPHRD_SLIP;
> -	dev->tx_queue_len = 256;
> -	dev->flags = IFF_NOARP;
> -	printk("SLIP backend - SLIP IP = %s\n", spri->gate_addr);
> -}
> -
> -static unsigned short slip_protocol(struct sk_buff *skbuff)
> -{
> -	return htons(ETH_P_IP);
> -}
> -
> -static int slip_read(int fd, struct sk_buff *skb, struct uml_net_private *lp)
> -{
> -	return slip_user_read(fd, skb_mac_header(skb), skb->dev->mtu,
> -			      (struct slip_data *) &lp->user);
> -}
> -
> -static int slip_write(int fd, struct sk_buff *skb, struct uml_net_private *lp)
> -{
> -	return slip_user_write(fd, skb->data, skb->len,
> -			       (struct slip_data *) &lp->user);
> -}
> -
> -static const struct net_kern_info slip_kern_info = {
> -	.init			= slip_init,
> -	.protocol		= slip_protocol,
> -	.read			= slip_read,
> -	.write			= slip_write,
> -};
> -
> -static int slip_setup(char *str, char **mac_out, void *data)
> -{
> -	struct slip_init *init = data;
> -
> -	*init = ((struct slip_init) { .gate_addr = NULL });
> -
> -	if (str[0] != '\0')
> -		init->gate_addr = str;
> -	return 1;
> -}
> -
> -static struct transport slip_transport = {
> -	.list 		= LIST_HEAD_INIT(slip_transport.list),
> -	.name 		= "slip",
> -	.setup  	= slip_setup,
> -	.user 		= &slip_user_info,
> -	.kern 		= &slip_kern_info,
> -	.private_size 	= sizeof(struct slip_data),
> -	.setup_size 	= sizeof(struct slip_init),
> -};
> -
> -static int register_slip(void)
> -{
> -	register_transport(&slip_transport);
> -	return 0;
> -}
> -
> -late_initcall(register_slip);
> diff --git a/arch/um/drivers/slip_user.c b/arch/um/drivers/slip_user.c
> deleted file mode 100644
> index 7334019c9e60..000000000000
> --- a/arch/um/drivers/slip_user.c
> +++ /dev/null
> @@ -1,252 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * Copyright (C) 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
> - */
> -
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <unistd.h>
> -#include <errno.h>
> -#include <fcntl.h>
> -#include <string.h>
> -#include <termios.h>
> -#include <sys/wait.h>
> -#include <net_user.h>
> -#include <os.h>
> -#include "slip.h"
> -#include <um_malloc.h>
> -
> -static int slip_user_init(void *data, void *dev)
> -{
> -	struct slip_data *pri = data;
> -
> -	pri->dev = dev;
> -	return 0;
> -}
> -
> -static int set_up_tty(int fd)
> -{
> -	int i;
> -	struct termios tios;
> -
> -	if (tcgetattr(fd, &tios) < 0) {
> -		printk(UM_KERN_ERR "could not get initial terminal "
> -		       "attributes\n");
> -		return -1;
> -	}
> -
> -	tios.c_cflag = CS8 | CREAD | HUPCL | CLOCAL;
> -	tios.c_iflag = IGNBRK | IGNPAR;
> -	tios.c_oflag = 0;
> -	tios.c_lflag = 0;
> -	for (i = 0; i < NCCS; i++)
> -		tios.c_cc[i] = 0;
> -	tios.c_cc[VMIN] = 1;
> -	tios.c_cc[VTIME] = 0;
> -
> -	cfsetospeed(&tios, B38400);
> -	cfsetispeed(&tios, B38400);
> -
> -	if (tcsetattr(fd, TCSAFLUSH, &tios) < 0) {
> -		printk(UM_KERN_ERR "failed to set terminal attributes\n");
> -		return -1;
> -	}
> -	return 0;
> -}
> -
> -struct slip_pre_exec_data {
> -	int stdin_fd;
> -	int stdout_fd;
> -	int close_me;
> -};
> -
> -static void slip_pre_exec(void *arg)
> -{
> -	struct slip_pre_exec_data *data = arg;
> -
> -	if (data->stdin_fd >= 0)
> -		dup2(data->stdin_fd, 0);
> -	dup2(data->stdout_fd, 1);
> -	if (data->close_me >= 0)
> -		close(data->close_me);
> -}
> -
> -static int slip_tramp(char **argv, int fd)
> -{
> -	struct slip_pre_exec_data pe_data;
> -	char *output;
> -	int pid, fds[2], err, output_len;
> -
> -	err = os_pipe(fds, 1, 0);
> -	if (err < 0) {
> -		printk(UM_KERN_ERR "slip_tramp : pipe failed, err = %d\n",
> -		       -err);
> -		goto out;
> -	}
> -
> -	err = 0;
> -	pe_data.stdin_fd = fd;
> -	pe_data.stdout_fd = fds[1];
> -	pe_data.close_me = fds[0];
> -	err = run_helper(slip_pre_exec, &pe_data, argv);
> -	if (err < 0)
> -		goto out_close;
> -	pid = err;
> -
> -	output_len = UM_KERN_PAGE_SIZE;
> -	output = uml_kmalloc(output_len, UM_GFP_KERNEL);
> -	if (output == NULL) {
> -		printk(UM_KERN_ERR "slip_tramp : failed to allocate output "
> -		       "buffer\n");
> -		os_kill_process(pid, 1);
> -		err = -ENOMEM;
> -		goto out_close;
> -	}
> -
> -	close(fds[1]);
> -	read_output(fds[0], output, output_len);
> -	printk("%s", output);
> -
> -	err = helper_wait(pid);
> -	close(fds[0]);
> -
> -	kfree(output);
> -	return err;
> -
> -out_close:
> -	close(fds[0]);
> -	close(fds[1]);
> -out:
> -	return err;
> -}
> -
> -static int slip_open(void *data)
> -{
> -	struct slip_data *pri = data;
> -	char version_buf[sizeof("nnnnn\0")];
> -	char gate_buf[sizeof("nnn.nnn.nnn.nnn\0")];
> -	char *argv[] = { "uml_net", version_buf, "slip", "up", gate_buf,
> -			 NULL };
> -	int sfd, mfd, err;
> -
> -	err = get_pty();
> -	if (err < 0) {
> -		printk(UM_KERN_ERR "slip-open : Failed to open pty, err = %d\n",
> -		       -err);
> -		goto out;
> -	}
> -	mfd = err;
> -
> -	err = open(ptsname(mfd), O_RDWR, 0);
> -	if (err < 0) {
> -		printk(UM_KERN_ERR "Couldn't open tty for slip line, "
> -		       "err = %d\n", -err);
> -		goto out_close;
> -	}
> -	sfd = err;
> -
> -	err = set_up_tty(sfd);
> -	if (err)
> -		goto out_close2;
> -
> -	pri->slave = sfd;
> -	pri->slip.pos = 0;
> -	pri->slip.esc = 0;
> -	if (pri->gate_addr != NULL) {
> -		sprintf(version_buf, "%d", UML_NET_VERSION);
> -		strcpy(gate_buf, pri->gate_addr);
> -
> -		err = slip_tramp(argv, sfd);
> -
> -		if (err < 0) {
> -			printk(UM_KERN_ERR "slip_tramp failed - err = %d\n",
> -			       -err);
> -			goto out_close2;
> -		}
> -		err = os_get_ifname(pri->slave, pri->name);
> -		if (err < 0) {
> -			printk(UM_KERN_ERR "get_ifname failed, err = %d\n",
> -			       -err);
> -			goto out_close2;
> -		}
> -		iter_addresses(pri->dev, open_addr, pri->name);
> -	}
> -	else {
> -		err = os_set_slip(sfd);
> -		if (err < 0) {
> -			printk(UM_KERN_ERR "Failed to set slip discipline "
> -			       "encapsulation - err = %d\n", -err);
> -			goto out_close2;
> -		}
> -	}
> -	return mfd;
> -out_close2:
> -	close(sfd);
> -out_close:
> -	close(mfd);
> -out:
> -	return err;
> -}
> -
> -static void slip_close(int fd, void *data)
> -{
> -	struct slip_data *pri = data;
> -	char version_buf[sizeof("nnnnn\0")];
> -	char *argv[] = { "uml_net", version_buf, "slip", "down", pri->name,
> -			 NULL };
> -	int err;
> -
> -	if (pri->gate_addr != NULL)
> -		iter_addresses(pri->dev, close_addr, pri->name);
> -
> -	sprintf(version_buf, "%d", UML_NET_VERSION);
> -
> -	err = slip_tramp(argv, pri->slave);
> -
> -	if (err != 0)
> -		printk(UM_KERN_ERR "slip_tramp failed - errno = %d\n", -err);
> -	close(fd);
> -	close(pri->slave);
> -	pri->slave = -1;
> -}
> -
> -int slip_user_read(int fd, void *buf, int len, struct slip_data *pri)
> -{
> -	return slip_proto_read(fd, buf, len, &pri->slip);
> -}
> -
> -int slip_user_write(int fd, void *buf, int len, struct slip_data *pri)
> -{
> -	return slip_proto_write(fd, buf, len, &pri->slip);
> -}
> -
> -static void slip_add_addr(unsigned char *addr, unsigned char *netmask,
> -			  void *data)
> -{
> -	struct slip_data *pri = data;
> -
> -	if (pri->slave < 0)
> -		return;
> -	open_addr(addr, netmask, pri->name);
> -}
> -
> -static void slip_del_addr(unsigned char *addr, unsigned char *netmask,
> -			    void *data)
> -{
> -	struct slip_data *pri = data;
> -
> -	if (pri->slave < 0)
> -		return;
> -	close_addr(addr, netmask, pri->name);
> -}
> -
> -const struct net_user_info slip_user_info = {
> -	.init		= slip_user_init,
> -	.open		= slip_open,
> -	.close	 	= slip_close,
> -	.remove	 	= NULL,
> -	.add_address	= slip_add_addr,
> -	.delete_address = slip_del_addr,
> -	.mtu		= BUF_SIZE,
> -	.max_packet	= BUF_SIZE,
> -};
> diff --git a/arch/um/drivers/slirp.h b/arch/um/drivers/slirp.h
> deleted file mode 100644
> index 4aef2b88249a..000000000000
> --- a/arch/um/drivers/slirp.h
> +++ /dev/null
> @@ -1,34 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 */
> -#ifndef __UM_SLIRP_H
> -#define __UM_SLIRP_H
> -
> -#include "slip_common.h"
> -
> -#define SLIRP_MAX_ARGS 100
> -/*
> - * XXX this next definition is here because I don't understand why this
> - * initializer doesn't work in slirp_kern.c:
> - *
> - *   argv :  { init->argv[ 0 ... SLIRP_MAX_ARGS-1 ] },
> - *
> - * or why I can't typecast like this:
> - *
> - *   argv :  (char* [SLIRP_MAX_ARGS])(init->argv),
> - */
> -struct arg_list_dummy_wrapper { char *argv[SLIRP_MAX_ARGS]; };
> -
> -struct slirp_data {
> -	void *dev;
> -	struct arg_list_dummy_wrapper argw;
> -	int pid;
> -	int slave;
> -	struct slip_proto slip;
> -};
> -
> -extern const struct net_user_info slirp_user_info;
> -
> -extern int slirp_user_read(int fd, void *buf, int len, struct slirp_data *pri);
> -extern int slirp_user_write(int fd, void *buf, int len,
> -			    struct slirp_data *pri);
> -
> -#endif
> diff --git a/arch/um/drivers/slirp_kern.c b/arch/um/drivers/slirp_kern.c
> deleted file mode 100644
> index 0a6151ee9572..000000000000
> --- a/arch/um/drivers/slirp_kern.c
> +++ /dev/null
> @@ -1,120 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * Copyright (C) 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
> - */
> -
> -#include <linux/if_arp.h>
> -#include <linux/init.h>
> -#include <linux/netdevice.h>
> -#include <linux/string.h>
> -#include <net_kern.h>
> -#include <net_user.h>
> -#include "slirp.h"
> -
> -struct slirp_init {
> -	struct arg_list_dummy_wrapper argw;  /* XXX should be simpler... */
> -};
> -
> -static void slirp_init(struct net_device *dev, void *data)
> -{
> -	struct uml_net_private *private;
> -	struct slirp_data *spri;
> -	struct slirp_init *init = data;
> -	int i;
> -
> -	private = netdev_priv(dev);
> -	spri = (struct slirp_data *) private->user;
> -
> -	spri->argw = init->argw;
> -	spri->pid = -1;
> -	spri->slave = -1;
> -	spri->dev = dev;
> -
> -	slip_proto_init(&spri->slip);
> -
> -	dev->hard_header_len = 0;
> -	dev->header_ops = NULL;
> -	dev->addr_len = 0;
> -	dev->type = ARPHRD_SLIP;
> -	dev->tx_queue_len = 256;
> -	dev->flags = IFF_NOARP;
> -	printk("SLIRP backend - command line:");
> -	for (i = 0; spri->argw.argv[i] != NULL; i++)
> -		printk(" '%s'",spri->argw.argv[i]);
> -	printk("\n");
> -}
> -
> -static unsigned short slirp_protocol(struct sk_buff *skbuff)
> -{
> -	return htons(ETH_P_IP);
> -}
> -
> -static int slirp_read(int fd, struct sk_buff *skb, struct uml_net_private *lp)
> -{
> -	return slirp_user_read(fd, skb_mac_header(skb), skb->dev->mtu,
> -			       (struct slirp_data *) &lp->user);
> -}
> -
> -static int slirp_write(int fd, struct sk_buff *skb, struct uml_net_private *lp)
> -{
> -	return slirp_user_write(fd, skb->data, skb->len,
> -				(struct slirp_data *) &lp->user);
> -}
> -
> -const struct net_kern_info slirp_kern_info = {
> -	.init			= slirp_init,
> -	.protocol		= slirp_protocol,
> -	.read			= slirp_read,
> -	.write			= slirp_write,
> -};
> -
> -static int slirp_setup(char *str, char **mac_out, void *data)
> -{
> -	struct slirp_init *init = data;
> -	int i=0;
> -
> -	*init = ((struct slirp_init) { .argw = { { "slirp", NULL  } } });
> -
> -	str = split_if_spec(str, mac_out, NULL);
> -
> -	if (str == NULL) /* no command line given after MAC addr */
> -		return 1;
> -
> -	do {
> -		if (i >= SLIRP_MAX_ARGS - 1) {
> -			printk(KERN_WARNING "slirp_setup: truncating slirp "
> -			       "arguments\n");
> -			break;
> -		}
> -		init->argw.argv[i++] = str;
> -		while(*str && *str!=',') {
> -			if (*str == '_')
> -				*str=' ';
> -			str++;
> -		}
> -		if (*str != ',')
> -			break;
> -		*str++ = '\0';
> -	} while (1);
> -
> -	init->argw.argv[i] = NULL;
> -	return 1;
> -}
> -
> -static struct transport slirp_transport = {
> -	.list 		= LIST_HEAD_INIT(slirp_transport.list),
> -	.name 		= "slirp",
> -	.setup  	= slirp_setup,
> -	.user 		= &slirp_user_info,
> -	.kern 		= &slirp_kern_info,
> -	.private_size 	= sizeof(struct slirp_data),
> -	.setup_size 	= sizeof(struct slirp_init),
> -};
> -
> -static int register_slirp(void)
> -{
> -	register_transport(&slirp_transport);
> -	return 0;
> -}
> -
> -late_initcall(register_slirp);
> diff --git a/arch/um/drivers/slirp_user.c b/arch/um/drivers/slirp_user.c
> deleted file mode 100644
> index 97228aa080cb..000000000000
> --- a/arch/um/drivers/slirp_user.c
> +++ /dev/null
> @@ -1,124 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * Copyright (C) 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
> - */
> -
> -#include <unistd.h>
> -#include <errno.h>
> -#include <string.h>
> -#include <sys/wait.h>
> -#include <net_user.h>
> -#include <os.h>
> -#include "slirp.h"
> -
> -static int slirp_user_init(void *data, void *dev)
> -{
> -	struct slirp_data *pri = data;
> -
> -	pri->dev = dev;
> -	return 0;
> -}
> -
> -struct slirp_pre_exec_data {
> -	int stdin_fd;
> -	int stdout_fd;
> -};
> -
> -static void slirp_pre_exec(void *arg)
> -{
> -	struct slirp_pre_exec_data *data = arg;
> -
> -	if (data->stdin_fd != -1)
> -		dup2(data->stdin_fd, 0);
> -	if (data->stdout_fd != -1)
> -		dup2(data->stdout_fd, 1);
> -}
> -
> -static int slirp_tramp(char **argv, int fd)
> -{
> -	struct slirp_pre_exec_data pe_data;
> -	int pid;
> -
> -	pe_data.stdin_fd = fd;
> -	pe_data.stdout_fd = fd;
> -	pid = run_helper(slirp_pre_exec, &pe_data, argv);
> -
> -	return pid;
> -}
> -
> -static int slirp_open(void *data)
> -{
> -	struct slirp_data *pri = data;
> -	int fds[2], err;
> -
> -	err = os_pipe(fds, 1, 1);
> -	if (err)
> -		return err;
> -
> -	err = slirp_tramp(pri->argw.argv, fds[1]);
> -	if (err < 0) {
> -		printk(UM_KERN_ERR "slirp_tramp failed - errno = %d\n", -err);
> -		goto out;
> -	}
> -
> -	pri->slave = fds[1];
> -	pri->slip.pos = 0;
> -	pri->slip.esc = 0;
> -	pri->pid = err;
> -
> -	return fds[0];
> -out:
> -	close(fds[0]);
> -	close(fds[1]);
> -	return err;
> -}
> -
> -static void slirp_close(int fd, void *data)
> -{
> -	struct slirp_data *pri = data;
> -	int err;
> -
> -	close(fd);
> -	close(pri->slave);
> -
> -	pri->slave = -1;
> -
> -	if (pri->pid<1) {
> -		printk(UM_KERN_ERR "slirp_close: no child process to shut "
> -		       "down\n");
> -		return;
> -	}
> -
> -#if 0
> -	if (kill(pri->pid, SIGHUP)<0) {
> -		printk(UM_KERN_ERR "slirp_close: sending hangup to %d failed "
> -		       "(%d)\n", pri->pid, errno);
> -	}
> -#endif
> -	err = helper_wait(pri->pid);
> -	if (err < 0)
> -		return;
> -
> -	pri->pid = -1;
> -}
> -
> -int slirp_user_read(int fd, void *buf, int len, struct slirp_data *pri)
> -{
> -	return slip_proto_read(fd, buf, len, &pri->slip);
> -}
> -
> -int slirp_user_write(int fd, void *buf, int len, struct slirp_data *pri)
> -{
> -	return slip_proto_write(fd, buf, len, &pri->slip);
> -}
> -
> -const struct net_user_info slirp_user_info = {
> -	.init		= slirp_user_init,
> -	.open		= slirp_open,
> -	.close	 	= slirp_close,
> -	.remove	 	= NULL,
> -	.add_address	= NULL,
> -	.delete_address = NULL,
> -	.mtu		= BUF_SIZE,
> -	.max_packet	= BUF_SIZE,
> -};
> diff --git a/arch/um/drivers/umcast.h b/arch/um/drivers/umcast.h
> deleted file mode 100644
> index fe39bee1e3bd..000000000000
> --- a/arch/um/drivers/umcast.h
> +++ /dev/null
> @@ -1,27 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 */
> -/*
> - * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
> - */
> -
> -#ifndef __DRIVERS_UMCAST_H
> -#define __DRIVERS_UMCAST_H
> -
> -#include <net_user.h>
> -
> -struct umcast_data {
> -	char *addr;
> -	unsigned short lport;
> -	unsigned short rport;
> -	void *listen_addr;
> -	void *remote_addr;
> -	int ttl;
> -	int unicast;
> -	void *dev;
> -};
> -
> -extern const struct net_user_info umcast_user_info;
> -
> -extern int umcast_user_write(int fd, void *buf, int len,
> -			     struct umcast_data *pri);
> -
> -#endif
> diff --git a/arch/um/drivers/umcast_kern.c b/arch/um/drivers/umcast_kern.c
> deleted file mode 100644
> index 595a54f2b9c6..000000000000
> --- a/arch/um/drivers/umcast_kern.c
> +++ /dev/null
> @@ -1,188 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * user-mode-linux networking multicast transport
> - * Copyright (C) 2001 by Harald Welte <laforge at gnumonks.org>
> - * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
> - *
> - * based on the existing uml-networking code, which is
> - * Copyright (C) 2001 Lennert Buytenhek (buytenh at gnu.org) and
> - * James Leu (jleu at mindspring.net).
> - * Copyright (C) 2001 by various other people who didn't put their name here.
> - *
> - */
> -
> -#include <linux/init.h>
> -#include <linux/netdevice.h>
> -#include "umcast.h"
> -#include <net_kern.h>
> -
> -struct umcast_init {
> -	char *addr;
> -	int lport;
> -	int rport;
> -	int ttl;
> -	bool unicast;
> -};
> -
> -static void umcast_init(struct net_device *dev, void *data)
> -{
> -	struct uml_net_private *pri;
> -	struct umcast_data *dpri;
> -	struct umcast_init *init = data;
> -
> -	pri = netdev_priv(dev);
> -	dpri = (struct umcast_data *) pri->user;
> -	dpri->addr = init->addr;
> -	dpri->lport = init->lport;
> -	dpri->rport = init->rport;
> -	dpri->unicast = init->unicast;
> -	dpri->ttl = init->ttl;
> -	dpri->dev = dev;
> -
> -	if (dpri->unicast) {
> -		printk(KERN_INFO "ucast backend address: %s:%u listen port: "
> -		       "%u\n", dpri->addr, dpri->rport, dpri->lport);
> -	} else {
> -		printk(KERN_INFO "mcast backend multicast address: %s:%u, "
> -		       "TTL:%u\n", dpri->addr, dpri->lport, dpri->ttl);
> -	}
> -}
> -
> -static int umcast_read(int fd, struct sk_buff *skb, struct uml_net_private *lp)
> -{
> -	return net_recvfrom(fd, skb_mac_header(skb),
> -			    skb->dev->mtu + ETH_HEADER_OTHER);
> -}
> -
> -static int umcast_write(int fd, struct sk_buff *skb, struct uml_net_private *lp)
> -{
> -	return umcast_user_write(fd, skb->data, skb->len,
> -				(struct umcast_data *) &lp->user);
> -}
> -
> -static const struct net_kern_info umcast_kern_info = {
> -	.init			= umcast_init,
> -	.protocol		= eth_protocol,
> -	.read			= umcast_read,
> -	.write			= umcast_write,
> -};
> -
> -static int mcast_setup(char *str, char **mac_out, void *data)
> -{
> -	struct umcast_init *init = data;
> -	char *port_str = NULL, *ttl_str = NULL, *remain;
> -	char *last;
> -
> -	*init = ((struct umcast_init)
> -		{ .addr	= "239.192.168.1",
> -		  .lport	= 1102,
> -		  .ttl	= 1 });
> -
> -	remain = split_if_spec(str, mac_out, &init->addr, &port_str, &ttl_str,
> -			       NULL);
> -	if (remain != NULL) {
> -		printk(KERN_ERR "mcast_setup - Extra garbage on "
> -		       "specification : '%s'\n", remain);
> -		return 0;
> -	}
> -
> -	if (port_str != NULL) {
> -		init->lport = simple_strtoul(port_str, &last, 10);
> -		if ((*last != '\0') || (last == port_str)) {
> -			printk(KERN_ERR "mcast_setup - Bad port : '%s'\n",
> -			       port_str);
> -			return 0;
> -		}
> -	}
> -
> -	if (ttl_str != NULL) {
> -		init->ttl = simple_strtoul(ttl_str, &last, 10);
> -		if ((*last != '\0') || (last == ttl_str)) {
> -			printk(KERN_ERR "mcast_setup - Bad ttl : '%s'\n",
> -			       ttl_str);
> -			return 0;
> -		}
> -	}
> -
> -	init->unicast = false;
> -	init->rport = init->lport;
> -
> -	printk(KERN_INFO "Configured mcast device: %s:%u-%u\n", init->addr,
> -	       init->lport, init->ttl);
> -
> -	return 1;
> -}
> -
> -static int ucast_setup(char *str, char **mac_out, void *data)
> -{
> -	struct umcast_init *init = data;
> -	char *lport_str = NULL, *rport_str = NULL, *remain;
> -	char *last;
> -
> -	*init = ((struct umcast_init)
> -		{ .addr		= "",
> -		  .lport	= 1102,
> -		  .rport	= 1102 });
> -
> -	remain = split_if_spec(str, mac_out, &init->addr,
> -			       &lport_str, &rport_str, NULL);
> -	if (remain != NULL) {
> -		printk(KERN_ERR "ucast_setup - Extra garbage on "
> -		       "specification : '%s'\n", remain);
> -		return 0;
> -	}
> -
> -	if (lport_str != NULL) {
> -		init->lport = simple_strtoul(lport_str, &last, 10);
> -		if ((*last != '\0') || (last == lport_str)) {
> -			printk(KERN_ERR "ucast_setup - Bad listen port : "
> -			       "'%s'\n", lport_str);
> -			return 0;
> -		}
> -	}
> -
> -	if (rport_str != NULL) {
> -		init->rport = simple_strtoul(rport_str, &last, 10);
> -		if ((*last != '\0') || (last == rport_str)) {
> -			printk(KERN_ERR "ucast_setup - Bad remote port : "
> -			       "'%s'\n", rport_str);
> -			return 0;
> -		}
> -	}
> -
> -	init->unicast = true;
> -
> -	printk(KERN_INFO "Configured ucast device: :%u -> %s:%u\n",
> -	       init->lport, init->addr, init->rport);
> -
> -	return 1;
> -}
> -
> -static struct transport mcast_transport = {
> -	.list	= LIST_HEAD_INIT(mcast_transport.list),
> -	.name	= "mcast",
> -	.setup	= mcast_setup,
> -	.user	= &umcast_user_info,
> -	.kern	= &umcast_kern_info,
> -	.private_size	= sizeof(struct umcast_data),
> -	.setup_size	= sizeof(struct umcast_init),
> -};
> -
> -static struct transport ucast_transport = {
> -	.list	= LIST_HEAD_INIT(ucast_transport.list),
> -	.name	= "ucast",
> -	.setup	= ucast_setup,
> -	.user	= &umcast_user_info,
> -	.kern	= &umcast_kern_info,
> -	.private_size	= sizeof(struct umcast_data),
> -	.setup_size	= sizeof(struct umcast_init),
> -};
> -
> -static int register_umcast(void)
> -{
> -	register_transport(&mcast_transport);
> -	register_transport(&ucast_transport);
> -	return 0;
> -}
> -
> -late_initcall(register_umcast);
> diff --git a/arch/um/drivers/umcast_user.c b/arch/um/drivers/umcast_user.c
> deleted file mode 100644
> index b50b13cff04e..000000000000
> --- a/arch/um/drivers/umcast_user.c
> +++ /dev/null
> @@ -1,184 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * user-mode-linux networking multicast transport
> - * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
> - * Copyright (C) 2001 by Harald Welte <laforge at gnumonks.org>
> - *
> - * based on the existing uml-networking code, which is
> - * Copyright (C) 2001 Lennert Buytenhek (buytenh at gnu.org) and
> - * James Leu (jleu at mindspring.net).
> - * Copyright (C) 2001 by various other people who didn't put their name here.
> - *
> - *
> - */
> -
> -#include <unistd.h>
> -#include <errno.h>
> -#include <netinet/in.h>
> -#include "umcast.h"
> -#include <net_user.h>
> -#include <um_malloc.h>
> -
> -static struct sockaddr_in *new_addr(char *addr, unsigned short port)
> -{
> -	struct sockaddr_in *sin;
> -
> -	sin = uml_kmalloc(sizeof(struct sockaddr_in), UM_GFP_KERNEL);
> -	if (sin == NULL) {
> -		printk(UM_KERN_ERR "new_addr: allocation of sockaddr_in "
> -		       "failed\n");
> -		return NULL;
> -	}
> -	sin->sin_family = AF_INET;
> -	if (addr)
> -		sin->sin_addr.s_addr = in_aton(addr);
> -	else
> -		sin->sin_addr.s_addr = INADDR_ANY;
> -	sin->sin_port = htons(port);
> -	return sin;
> -}
> -
> -static int umcast_user_init(void *data, void *dev)
> -{
> -	struct umcast_data *pri = data;
> -
> -	pri->remote_addr = new_addr(pri->addr, pri->rport);
> -	if (pri->unicast)
> -		pri->listen_addr = new_addr(NULL, pri->lport);
> -	else
> -		pri->listen_addr = pri->remote_addr;
> -	pri->dev = dev;
> -	return 0;
> -}
> -
> -static void umcast_remove(void *data)
> -{
> -	struct umcast_data *pri = data;
> -
> -	kfree(pri->listen_addr);
> -	if (pri->unicast)
> -		kfree(pri->remote_addr);
> -	pri->listen_addr = pri->remote_addr = NULL;
> -}
> -
> -static int umcast_open(void *data)
> -{
> -	struct umcast_data *pri = data;
> -	struct sockaddr_in *lsin = pri->listen_addr;
> -	struct sockaddr_in *rsin = pri->remote_addr;
> -	struct ip_mreq mreq;
> -	int fd, yes = 1, err = -EINVAL;
> -
> -
> -	if ((!pri->unicast && lsin->sin_addr.s_addr == 0) ||
> -	    (rsin->sin_addr.s_addr == 0) ||
> -	    (lsin->sin_port == 0) || (rsin->sin_port == 0))
> -		goto out;
> -
> -	fd = socket(AF_INET, SOCK_DGRAM, 0);
> -
> -	if (fd < 0) {
> -		err = -errno;
> -		printk(UM_KERN_ERR "umcast_open : data socket failed, "
> -		       "errno = %d\n", errno);
> -		goto out;
> -	}
> -
> -	if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) < 0) {
> -		err = -errno;
> -		printk(UM_KERN_ERR "umcast_open: SO_REUSEADDR failed, "
> -		       "errno = %d\n", errno);
> -		goto out_close;
> -	}
> -
> -	if (!pri->unicast) {
> -		/* set ttl according to config */
> -		if (setsockopt(fd, SOL_IP, IP_MULTICAST_TTL, &pri->ttl,
> -			       sizeof(pri->ttl)) < 0) {
> -			err = -errno;
> -			printk(UM_KERN_ERR "umcast_open: IP_MULTICAST_TTL "
> -			       "failed, error = %d\n", errno);
> -			goto out_close;
> -		}
> -
> -		/* set LOOP, so data does get fed back to local sockets */
> -		if (setsockopt(fd, SOL_IP, IP_MULTICAST_LOOP,
> -			       &yes, sizeof(yes)) < 0) {
> -			err = -errno;
> -			printk(UM_KERN_ERR "umcast_open: IP_MULTICAST_LOOP "
> -			       "failed, error = %d\n", errno);
> -			goto out_close;
> -		}
> -	}
> -
> -	/* bind socket to the address */
> -	if (bind(fd, (struct sockaddr *) lsin, sizeof(*lsin)) < 0) {
> -		err = -errno;
> -		printk(UM_KERN_ERR "umcast_open : data bind failed, "
> -		       "errno = %d\n", errno);
> -		goto out_close;
> -	}
> -
> -	if (!pri->unicast) {
> -		/* subscribe to the multicast group */
> -		mreq.imr_multiaddr.s_addr = lsin->sin_addr.s_addr;
> -		mreq.imr_interface.s_addr = 0;
> -		if (setsockopt(fd, SOL_IP, IP_ADD_MEMBERSHIP,
> -			       &mreq, sizeof(mreq)) < 0) {
> -			err = -errno;
> -			printk(UM_KERN_ERR "umcast_open: IP_ADD_MEMBERSHIP "
> -			       "failed, error = %d\n", errno);
> -			printk(UM_KERN_ERR "There appears not to be a "
> -			       "multicast-capable network interface on the "
> -			       "host.\n");
> -			printk(UM_KERN_ERR "eth0 should be configured in order "
> -			       "to use the multicast transport.\n");
> -			goto out_close;
> -		}
> -	}
> -
> -	return fd;
> -
> - out_close:
> -	close(fd);
> - out:
> -	return err;
> -}
> -
> -static void umcast_close(int fd, void *data)
> -{
> -	struct umcast_data *pri = data;
> -
> -	if (!pri->unicast) {
> -		struct ip_mreq mreq;
> -		struct sockaddr_in *lsin = pri->listen_addr;
> -
> -		mreq.imr_multiaddr.s_addr = lsin->sin_addr.s_addr;
> -		mreq.imr_interface.s_addr = 0;
> -		if (setsockopt(fd, SOL_IP, IP_DROP_MEMBERSHIP,
> -			       &mreq, sizeof(mreq)) < 0) {
> -			printk(UM_KERN_ERR "umcast_close: IP_DROP_MEMBERSHIP "
> -			       "failed, error = %d\n", errno);
> -		}
> -	}
> -
> -	close(fd);
> -}
> -
> -int umcast_user_write(int fd, void *buf, int len, struct umcast_data *pri)
> -{
> -	struct sockaddr_in *data_addr = pri->remote_addr;
> -
> -	return net_sendto(fd, buf, len, data_addr, sizeof(*data_addr));
> -}
> -
> -const struct net_user_info umcast_user_info = {
> -	.init	= umcast_user_init,
> -	.open	= umcast_open,
> -	.close	= umcast_close,
> -	.remove	= umcast_remove,
> -	.add_address	= NULL,
> -	.delete_address = NULL,
> -	.mtu	= ETH_MAX_PACKET,
> -	.max_packet	= ETH_MAX_PACKET + ETH_HEADER_OTHER,
> -};
> diff --git a/arch/um/drivers/vde.h b/arch/um/drivers/vde.h
> deleted file mode 100644
> index cab0379e6142..000000000000
> --- a/arch/um/drivers/vde.h
> +++ /dev/null
> @@ -1,32 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 */
> -/*
> - * Copyright (C) 2007 Luca Bigliardi (shammash at artha.org).
> - */
> -
> -#ifndef __UM_VDE_H__
> -#define __UM_VDE_H__
> -
> -struct vde_data {
> -	char *vde_switch;
> -	char *descr;
> -	void *args;
> -	void *conn;
> -	void *dev;
> -};
> -
> -struct vde_init {
> -	char *vde_switch;
> -	char *descr;
> -	int port;
> -	char *group;
> -	int mode;
> -};
> -
> -extern const struct net_user_info vde_user_info;
> -
> -extern void vde_init_libstuff(struct vde_data *vpri, struct vde_init *init);
> -
> -extern int vde_user_read(void *conn, void *buf, int len);
> -extern int vde_user_write(void *conn, void *buf, int len);
> -
> -#endif
> diff --git a/arch/um/drivers/vde_kern.c b/arch/um/drivers/vde_kern.c
> deleted file mode 100644
> index bc6f22cbfb35..000000000000
> --- a/arch/um/drivers/vde_kern.c
> +++ /dev/null
> @@ -1,129 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * Copyright (C) 2007 Luca Bigliardi (shammash at artha.org).
> - *
> - * Transport usage:
> - *  ethN=vde,<vde_switch>,<mac addr>,<port>,<group>,<mode>,<description>
> - *
> - */
> -
> -#include <linux/init.h>
> -#include <linux/netdevice.h>
> -#include <net_kern.h>
> -#include <net_user.h>
> -#include "vde.h"
> -
> -static void vde_init(struct net_device *dev, void *data)
> -{
> -	struct vde_init *init = data;
> -	struct uml_net_private *pri;
> -	struct vde_data *vpri;
> -
> -	pri = netdev_priv(dev);
> -	vpri = (struct vde_data *) pri->user;
> -
> -	vpri->vde_switch = init->vde_switch;
> -	vpri->descr = init->descr ? init->descr : "UML vde_transport";
> -	vpri->args = NULL;
> -	vpri->conn = NULL;
> -	vpri->dev = dev;
> -
> -	printk("vde backend - %s, ", vpri->vde_switch ?
> -	       vpri->vde_switch : "(default socket)");
> -
> -	vde_init_libstuff(vpri, init);
> -
> -	printk("\n");
> -}
> -
> -static int vde_read(int fd, struct sk_buff *skb, struct uml_net_private *lp)
> -{
> -	struct vde_data *pri = (struct vde_data *) &lp->user;
> -
> -	if (pri->conn != NULL)
> -		return vde_user_read(pri->conn, skb_mac_header(skb),
> -				     skb->dev->mtu + ETH_HEADER_OTHER);
> -
> -	printk(KERN_ERR "vde_read - we have no VDECONN to read from");
> -	return -EBADF;
> -}
> -
> -static int vde_write(int fd, struct sk_buff *skb, struct uml_net_private *lp)
> -{
> -	struct vde_data *pri = (struct vde_data *) &lp->user;
> -
> -	if (pri->conn != NULL)
> -		return vde_user_write((void *)pri->conn, skb->data,
> -				      skb->len);
> -
> -	printk(KERN_ERR "vde_write - we have no VDECONN to write to");
> -	return -EBADF;
> -}
> -
> -static const struct net_kern_info vde_kern_info = {
> -	.init			= vde_init,
> -	.protocol		= eth_protocol,
> -	.read			= vde_read,
> -	.write			= vde_write,
> -};
> -
> -static int vde_setup(char *str, char **mac_out, void *data)
> -{
> -	struct vde_init *init = data;
> -	char *remain, *port_str = NULL, *mode_str = NULL, *last;
> -
> -	*init = ((struct vde_init)
> -		{ .vde_switch		= NULL,
> -		  .descr		= NULL,
> -		  .port			= 0,
> -		  .group		= NULL,
> -		  .mode			= 0 });
> -
> -	remain = split_if_spec(str, &init->vde_switch, mac_out, &port_str,
> -				&init->group, &mode_str, &init->descr, NULL);
> -
> -	if (remain != NULL)
> -		printk(KERN_WARNING "vde_setup - Ignoring extra data :"
> -		       "'%s'\n", remain);
> -
> -	if (port_str != NULL) {
> -		init->port = simple_strtoul(port_str, &last, 10);
> -		if ((*last != '\0') || (last == port_str)) {
> -			printk(KERN_ERR "vde_setup - Bad port : '%s'\n",
> -						port_str);
> -			return 0;
> -		}
> -	}
> -
> -	if (mode_str != NULL) {
> -		init->mode = simple_strtoul(mode_str, &last, 8);
> -		if ((*last != '\0') || (last == mode_str)) {
> -			printk(KERN_ERR "vde_setup - Bad mode : '%s'\n",
> -						mode_str);
> -			return 0;
> -		}
> -	}
> -
> -	printk(KERN_INFO "Configured vde device: %s\n", init->vde_switch ?
> -	       init->vde_switch : "(default socket)");
> -
> -	return 1;
> -}
> -
> -static struct transport vde_transport = {
> -	.list 		= LIST_HEAD_INIT(vde_transport.list),
> -	.name 		= "vde",
> -	.setup  	= vde_setup,
> -	.user 		= &vde_user_info,
> -	.kern 		= &vde_kern_info,
> -	.private_size 	= sizeof(struct vde_data),
> -	.setup_size 	= sizeof(struct vde_init),
> -};
> -
> -static int register_vde(void)
> -{
> -	register_transport(&vde_transport);
> -	return 0;
> -}
> -
> -late_initcall(register_vde);
> diff --git a/arch/um/drivers/vde_user.c b/arch/um/drivers/vde_user.c
> deleted file mode 100644
> index bc7dc4e1e486..000000000000
> --- a/arch/um/drivers/vde_user.c
> +++ /dev/null
> @@ -1,125 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * Copyright (C) 2007 Luca Bigliardi (shammash at artha.org).
> - */
> -
> -#include <stddef.h>
> -#include <errno.h>
> -#include <libvdeplug.h>
> -#include <net_user.h>
> -#include <um_malloc.h>
> -#include "vde.h"
> -
> -static int vde_user_init(void *data, void *dev)
> -{
> -	struct vde_data *pri = data;
> -	VDECONN *conn = NULL;
> -	int err = -EINVAL;
> -
> -	pri->dev = dev;
> -
> -	conn = vde_open(pri->vde_switch, pri->descr, pri->args);
> -
> -	if (conn == NULL) {
> -		err = -errno;
> -		printk(UM_KERN_ERR "vde_user_init: vde_open failed, "
> -		       "errno = %d\n", errno);
> -		return err;
> -	}
> -
> -	printk(UM_KERN_INFO "vde backend - connection opened\n");
> -
> -	pri->conn = conn;
> -
> -	return 0;
> -}
> -
> -static int vde_user_open(void *data)
> -{
> -	struct vde_data *pri = data;
> -
> -	if (pri->conn != NULL)
> -		return vde_datafd(pri->conn);
> -
> -	printk(UM_KERN_WARNING "vde_open - we have no VDECONN to open");
> -	return -EINVAL;
> -}
> -
> -static void vde_remove(void *data)
> -{
> -	struct vde_data *pri = data;
> -
> -	if (pri->conn != NULL) {
> -		printk(UM_KERN_INFO "vde backend - closing connection\n");
> -		vde_close(pri->conn);
> -		pri->conn = NULL;
> -		kfree(pri->args);
> -		pri->args = NULL;
> -		return;
> -	}
> -
> -	printk(UM_KERN_WARNING "vde_remove - we have no VDECONN to remove");
> -}
> -
> -const struct net_user_info vde_user_info = {
> -	.init		= vde_user_init,
> -	.open		= vde_user_open,
> -	.close	 	= NULL,
> -	.remove	 	= vde_remove,
> -	.add_address	= NULL,
> -	.delete_address = NULL,
> -	.mtu		= ETH_MAX_PACKET,
> -	.max_packet	= ETH_MAX_PACKET + ETH_HEADER_OTHER,
> -};
> -
> -void vde_init_libstuff(struct vde_data *vpri, struct vde_init *init)
> -{
> -	struct vde_open_args *args;
> -
> -	vpri->args = uml_kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL);
> -	if (vpri->args == NULL) {
> -		printk(UM_KERN_ERR "vde_init_libstuff - vde_open_args "
> -		       "allocation failed");
> -		return;
> -	}
> -
> -	args = vpri->args;
> -
> -	args->port = init->port;
> -	args->group = init->group;
> -	args->mode = init->mode ? init->mode : 0700;
> -
> -	args->port ?  printk("port %d", args->port) :
> -		printk("undefined port");
> -}
> -
> -int vde_user_read(void *conn, void *buf, int len)
> -{
> -	VDECONN *vconn = conn;
> -	int rv;
> -
> -	if (vconn == NULL)
> -		return 0;
> -
> -	rv = vde_recv(vconn, buf, len, 0);
> -	if (rv < 0) {
> -		if (errno == EAGAIN)
> -			return 0;
> -		return -errno;
> -	}
> -	else if (rv == 0)
> -		return -ENOTCONN;
> -
> -	return rv;
> -}
> -
> -int vde_user_write(void *conn, void *buf, int len)
> -{
> -	VDECONN *vconn = conn;
> -
> -	if (vconn == NULL)
> -		return 0;
> -
> -	return vde_send(vconn, buf, len, 0);
> -}
> -
> diff --git a/arch/um/include/shared/os.h b/arch/um/include/shared/os.h
> index 152a60080d5b..e63a74a5ff19 100644
> --- a/arch/um/include/shared/os.h
> +++ b/arch/um/include/shared/os.h
> @@ -143,7 +143,6 @@ extern int os_access(const char *file, int mode);
>   extern int os_set_exec_close(int fd);
>   extern int os_ioctl_generic(int fd, unsigned int cmd, unsigned long arg);
>   extern int os_get_ifname(int fd, char *namebuf);
> -extern int os_set_slip(int fd);
>   extern int os_mode_fd(int fd, int mode);
>   
>   extern int os_seek_file(int fd, unsigned long long offset);
> diff --git a/arch/um/os-Linux/Makefile b/arch/um/os-Linux/Makefile
> index 049dfa5bc9c6..fae836713487 100644
> --- a/arch/um/os-Linux/Makefile
> +++ b/arch/um/os-Linux/Makefile
> @@ -8,7 +8,7 @@ KCOV_INSTRUMENT                := n
>   
>   obj-y = execvp.o file.o helper.o irq.o main.o mem.o process.o \
>   	registers.o sigio.o signal.o start_up.o time.o tty.o \
> -	umid.o user_syms.o util.o drivers/ skas/
> +	umid.o user_syms.o util.o skas/
>   
>   CFLAGS_signal.o += -Wframe-larger-than=4096
>   
> diff --git a/arch/um/os-Linux/drivers/Makefile b/arch/um/os-Linux/drivers/Makefile
> deleted file mode 100644
> index cf2d75bb1884..000000000000
> --- a/arch/um/os-Linux/drivers/Makefile
> +++ /dev/null
> @@ -1,13 +0,0 @@
> -# SPDX-License-Identifier: GPL-2.0
> -#
> -# Copyright (C) 2000, 2002 Jeff Dike (jdike at karaya.com)
> -#
> -
> -ethertap-objs := ethertap_kern.o ethertap_user.o
> -tuntap-objs := tuntap_kern.o tuntap_user.o
> -
> -obj-y =
> -obj-$(CONFIG_UML_NET_ETHERTAP) += ethertap.o
> -obj-$(CONFIG_UML_NET_TUNTAP) += tuntap.o
> -
> -include $(srctree)/arch/um/scripts/Makefile.rules
> diff --git a/arch/um/os-Linux/drivers/etap.h b/arch/um/os-Linux/drivers/etap.h
> deleted file mode 100644
> index a475259f90e1..000000000000
> --- a/arch/um/os-Linux/drivers/etap.h
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 */
> -/*
> - * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
> - */
> -
> -#ifndef __DRIVERS_ETAP_H
> -#define __DRIVERS_ETAP_H
> -
> -#include <net_user.h>
> -
> -struct ethertap_data {
> -	char *dev_name;
> -	char *gate_addr;
> -	int data_fd;
> -	int control_fd;
> -	void *dev;
> -};
> -
> -extern const struct net_user_info ethertap_user_info;
> -
> -#endif
> diff --git a/arch/um/os-Linux/drivers/ethertap_kern.c b/arch/um/os-Linux/drivers/ethertap_kern.c
> deleted file mode 100644
> index 5e5ee40680ce..000000000000
> --- a/arch/um/os-Linux/drivers/ethertap_kern.c
> +++ /dev/null
> @@ -1,100 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * Copyright (C) 2001 Lennert Buytenhek (buytenh at gnu.org) and
> - * James Leu (jleu at mindspring.net).
> - * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
> - * Copyright (C) 2001 by various other people who didn't put their name here.
> - */
> -
> -#include <linux/init.h>
> -#include <linux/netdevice.h>
> -#include "etap.h"
> -#include <net_kern.h>
> -
> -struct ethertap_init {
> -	char *dev_name;
> -	char *gate_addr;
> -};
> -
> -static void etap_init(struct net_device *dev, void *data)
> -{
> -	struct uml_net_private *pri;
> -	struct ethertap_data *epri;
> -	struct ethertap_init *init = data;
> -
> -	pri = netdev_priv(dev);
> -	epri = (struct ethertap_data *) pri->user;
> -	epri->dev_name = init->dev_name;
> -	epri->gate_addr = init->gate_addr;
> -	epri->data_fd = -1;
> -	epri->control_fd = -1;
> -	epri->dev = dev;
> -
> -	printk(KERN_INFO "ethertap backend - %s", epri->dev_name);
> -	if (epri->gate_addr != NULL)
> -		printk(KERN_CONT ", IP = %s", epri->gate_addr);
> -	printk(KERN_CONT "\n");
> -}
> -
> -static int etap_read(int fd, struct sk_buff *skb, struct uml_net_private *lp)
> -{
> -	int len;
> -
> -	len = net_recvfrom(fd, skb_mac_header(skb),
> -			   skb->dev->mtu + 2 + ETH_HEADER_ETHERTAP);
> -	if (len <= 0)
> -		return(len);
> -
> -	skb_pull(skb, 2);
> -	len -= 2;
> -	return len;
> -}
> -
> -static int etap_write(int fd, struct sk_buff *skb, struct uml_net_private *lp)
> -{
> -	skb_push(skb, 2);
> -	return net_send(fd, skb->data, skb->len);
> -}
> -
> -const struct net_kern_info ethertap_kern_info = {
> -	.init			= etap_init,
> -	.protocol		= eth_protocol,
> -	.read			= etap_read,
> -	.write 			= etap_write,
> -};
> -
> -static int ethertap_setup(char *str, char **mac_out, void *data)
> -{
> -	struct ethertap_init *init = data;
> -
> -	*init = ((struct ethertap_init)
> -		{ .dev_name 	= NULL,
> -		  .gate_addr 	= NULL });
> -	if (tap_setup_common(str, "ethertap", &init->dev_name, mac_out,
> -			    &init->gate_addr))
> -		return 0;
> -	if (init->dev_name == NULL) {
> -		printk(KERN_ERR "ethertap_setup : Missing tap device name\n");
> -		return 0;
> -	}
> -
> -	return 1;
> -}
> -
> -static struct transport ethertap_transport = {
> -	.list 		= LIST_HEAD_INIT(ethertap_transport.list),
> -	.name 		= "ethertap",
> -	.setup  	= ethertap_setup,
> -	.user 		= &ethertap_user_info,
> -	.kern 		= &ethertap_kern_info,
> -	.private_size 	= sizeof(struct ethertap_data),
> -	.setup_size 	= sizeof(struct ethertap_init),
> -};
> -
> -static int register_ethertap(void)
> -{
> -	register_transport(&ethertap_transport);
> -	return 0;
> -}
> -
> -late_initcall(register_ethertap);
> diff --git a/arch/um/os-Linux/drivers/ethertap_user.c b/arch/um/os-Linux/drivers/ethertap_user.c
> deleted file mode 100644
> index bdf215c0eca7..000000000000
> --- a/arch/um/os-Linux/drivers/ethertap_user.c
> +++ /dev/null
> @@ -1,248 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
> - * Copyright (C) 2001 Lennert Buytenhek (buytenh at gnu.org) and
> - * James Leu (jleu at mindspring.net).
> - * Copyright (C) 2001 by various other people who didn't put their name here.
> - */
> -
> -#include <stdio.h>
> -#include <unistd.h>
> -#include <errno.h>
> -#include <string.h>
> -#include <sys/socket.h>
> -#include <sys/wait.h>
> -#include "etap.h"
> -#include <os.h>
> -#include <net_user.h>
> -#include <um_malloc.h>
> -
> -#define MAX_PACKET ETH_MAX_PACKET
> -
> -static int etap_user_init(void *data, void *dev)
> -{
> -	struct ethertap_data *pri = data;
> -
> -	pri->dev = dev;
> -	return 0;
> -}
> -
> -struct addr_change {
> -	enum { ADD_ADDR, DEL_ADDR } what;
> -	unsigned char addr[4];
> -	unsigned char netmask[4];
> -};
> -
> -static void etap_change(int op, unsigned char *addr, unsigned char *netmask,
> -			int fd)
> -{
> -	struct addr_change change;
> -	char *output;
> -	int n;
> -
> -	change.what = op;
> -	memcpy(change.addr, addr, sizeof(change.addr));
> -	memcpy(change.netmask, netmask, sizeof(change.netmask));
> -	CATCH_EINTR(n = write(fd, &change, sizeof(change)));
> -	if (n != sizeof(change)) {
> -		printk(UM_KERN_ERR "etap_change - request failed, err = %d\n",
> -		       errno);
> -		return;
> -	}
> -
> -	output = uml_kmalloc(UM_KERN_PAGE_SIZE, UM_GFP_KERNEL);
> -	if (output == NULL)
> -		printk(UM_KERN_ERR "etap_change : Failed to allocate output "
> -		       "buffer\n");
> -	read_output(fd, output, UM_KERN_PAGE_SIZE);
> -	if (output != NULL) {
> -		printk("%s", output);
> -		kfree(output);
> -	}
> -}
> -
> -static void etap_open_addr(unsigned char *addr, unsigned char *netmask,
> -			   void *arg)
> -{
> -	etap_change(ADD_ADDR, addr, netmask, *((int *) arg));
> -}
> -
> -static void etap_close_addr(unsigned char *addr, unsigned char *netmask,
> -			    void *arg)
> -{
> -	etap_change(DEL_ADDR, addr, netmask, *((int *) arg));
> -}
> -
> -struct etap_pre_exec_data {
> -	int control_remote;
> -	int control_me;
> -	int data_me;
> -};
> -
> -static void etap_pre_exec(void *arg)
> -{
> -	struct etap_pre_exec_data *data = arg;
> -
> -	dup2(data->control_remote, 1);
> -	close(data->data_me);
> -	close(data->control_me);
> -}
> -
> -static int etap_tramp(char *dev, char *gate, int control_me,
> -		      int control_remote, int data_me, int data_remote)
> -{
> -	struct etap_pre_exec_data pe_data;
> -	int pid, err, n;
> -	char version_buf[sizeof("nnnnn\0")];
> -	char data_fd_buf[sizeof("nnnnnn\0")];
> -	char gate_buf[sizeof("nnn.nnn.nnn.nnn\0")];
> -	char *setup_args[] = { "uml_net", version_buf, "ethertap", dev,
> -			       data_fd_buf, gate_buf, NULL };
> -	char *nosetup_args[] = { "uml_net", version_buf, "ethertap",
> -				 dev, data_fd_buf, NULL };
> -	char **args, c;
> -
> -	sprintf(data_fd_buf, "%d", data_remote);
> -	sprintf(version_buf, "%d", UML_NET_VERSION);
> -	if (gate != NULL) {
> -		strscpy(gate_buf, gate);
> -		args = setup_args;
> -	}
> -	else args = nosetup_args;
> -
> -	err = 0;
> -	pe_data.control_remote = control_remote;
> -	pe_data.control_me = control_me;
> -	pe_data.data_me = data_me;
> -	pid = run_helper(etap_pre_exec, &pe_data, args);
> -
> -	if (pid < 0)
> -		err = pid;
> -	close(data_remote);
> -	close(control_remote);
> -	CATCH_EINTR(n = read(control_me, &c, sizeof(c)));
> -	if (n != sizeof(c)) {
> -		err = -errno;
> -		printk(UM_KERN_ERR "etap_tramp : read of status failed, "
> -		       "err = %d\n", -err);
> -		return err;
> -	}
> -	if (c != 1) {
> -		printk(UM_KERN_ERR "etap_tramp : uml_net failed\n");
> -		err = helper_wait(pid);
> -	}
> -	return err;
> -}
> -
> -static int etap_open(void *data)
> -{
> -	struct ethertap_data *pri = data;
> -	char *output;
> -	int data_fds[2], control_fds[2], err, output_len;
> -
> -	err = tap_open_common(pri->dev, pri->gate_addr);
> -	if (err)
> -		return err;
> -
> -	err = socketpair(AF_UNIX, SOCK_DGRAM, 0, data_fds);
> -	if (err) {
> -		err = -errno;
> -		printk(UM_KERN_ERR "etap_open - data socketpair failed - "
> -		       "err = %d\n", errno);
> -		return err;
> -	}
> -
> -	err = socketpair(AF_UNIX, SOCK_STREAM, 0, control_fds);
> -	if (err) {
> -		err = -errno;
> -		printk(UM_KERN_ERR "etap_open - control socketpair failed - "
> -		       "err = %d\n", errno);
> -		goto out_close_data;
> -	}
> -
> -	err = etap_tramp(pri->dev_name, pri->gate_addr, control_fds[0],
> -			 control_fds[1], data_fds[0], data_fds[1]);
> -	output_len = UM_KERN_PAGE_SIZE;
> -	output = uml_kmalloc(output_len, UM_GFP_KERNEL);
> -	read_output(control_fds[0], output, output_len);
> -
> -	if (output == NULL)
> -		printk(UM_KERN_ERR "etap_open : failed to allocate output "
> -		       "buffer\n");
> -	else {
> -		printk("%s", output);
> -		kfree(output);
> -	}
> -
> -	if (err < 0) {
> -		printk(UM_KERN_ERR "etap_tramp failed - err = %d\n", -err);
> -		goto out_close_control;
> -	}
> -
> -	pri->data_fd = data_fds[0];
> -	pri->control_fd = control_fds[0];
> -	iter_addresses(pri->dev, etap_open_addr, &pri->control_fd);
> -	return data_fds[0];
> -
> -out_close_control:
> -	close(control_fds[0]);
> -	close(control_fds[1]);
> -out_close_data:
> -	close(data_fds[0]);
> -	close(data_fds[1]);
> -	return err;
> -}
> -
> -static void etap_close(int fd, void *data)
> -{
> -	struct ethertap_data *pri = data;
> -
> -	iter_addresses(pri->dev, etap_close_addr, &pri->control_fd);
> -	close(fd);
> -
> -	if (shutdown(pri->data_fd, SHUT_RDWR) < 0)
> -		printk(UM_KERN_ERR "etap_close - shutdown data socket failed, "
> -		       "errno = %d\n", errno);
> -
> -	if (shutdown(pri->control_fd, SHUT_RDWR) < 0)
> -		printk(UM_KERN_ERR "etap_close - shutdown control socket "
> -		       "failed, errno = %d\n", errno);
> -
> -	close(pri->data_fd);
> -	pri->data_fd = -1;
> -	close(pri->control_fd);
> -	pri->control_fd = -1;
> -}
> -
> -static void etap_add_addr(unsigned char *addr, unsigned char *netmask,
> -			  void *data)
> -{
> -	struct ethertap_data *pri = data;
> -
> -	tap_check_ips(pri->gate_addr, addr);
> -	if (pri->control_fd == -1)
> -		return;
> -	etap_open_addr(addr, netmask, &pri->control_fd);
> -}
> -
> -static void etap_del_addr(unsigned char *addr, unsigned char *netmask,
> -			  void *data)
> -{
> -	struct ethertap_data *pri = data;
> -
> -	if (pri->control_fd == -1)
> -		return;
> -
> -	etap_close_addr(addr, netmask, &pri->control_fd);
> -}
> -
> -const struct net_user_info ethertap_user_info = {
> -	.init		= etap_user_init,
> -	.open		= etap_open,
> -	.close	 	= etap_close,
> -	.remove	 	= NULL,
> -	.add_address	= etap_add_addr,
> -	.delete_address = etap_del_addr,
> -	.mtu		= ETH_MAX_PACKET,
> -	.max_packet	= ETH_MAX_PACKET + ETH_HEADER_ETHERTAP,
> -};
> diff --git a/arch/um/os-Linux/drivers/tuntap.h b/arch/um/os-Linux/drivers/tuntap.h
> deleted file mode 100644
> index e364e42abfc5..000000000000
> --- a/arch/um/os-Linux/drivers/tuntap.h
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -/* SPDX-License-Identifier: GPL-2.0 */
> -/*
> - * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
> - */
> -
> -#ifndef __UM_TUNTAP_H
> -#define __UM_TUNTAP_H
> -
> -#include <net_user.h>
> -
> -struct tuntap_data {
> -	char *dev_name;
> -	int fixed_config;
> -	char *gate_addr;
> -	int fd;
> -	void *dev;
> -};
> -
> -extern const struct net_user_info tuntap_user_info;
> -
> -#endif
> diff --git a/arch/um/os-Linux/drivers/tuntap_kern.c b/arch/um/os-Linux/drivers/tuntap_kern.c
> deleted file mode 100644
> index ff022d9cf0dd..000000000000
> --- a/arch/um/os-Linux/drivers/tuntap_kern.c
> +++ /dev/null
> @@ -1,86 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
> - */
> -
> -#include <linux/netdevice.h>
> -#include <linux/init.h>
> -#include <linux/skbuff.h>
> -#include <asm/errno.h>
> -#include <net_kern.h>
> -#include "tuntap.h"
> -
> -struct tuntap_init {
> -	char *dev_name;
> -	char *gate_addr;
> -};
> -
> -static void tuntap_init(struct net_device *dev, void *data)
> -{
> -	struct uml_net_private *pri;
> -	struct tuntap_data *tpri;
> -	struct tuntap_init *init = data;
> -
> -	pri = netdev_priv(dev);
> -	tpri = (struct tuntap_data *) pri->user;
> -	tpri->dev_name = init->dev_name;
> -	tpri->fixed_config = (init->dev_name != NULL);
> -	tpri->gate_addr = init->gate_addr;
> -	tpri->fd = -1;
> -	tpri->dev = dev;
> -
> -	printk(KERN_INFO "TUN/TAP backend - ");
> -	if (tpri->gate_addr != NULL)
> -		printk(KERN_CONT "IP = %s", tpri->gate_addr);
> -	printk(KERN_CONT "\n");
> -}
> -
> -static int tuntap_read(int fd, struct sk_buff *skb, struct uml_net_private *lp)
> -{
> -	return net_read(fd, skb_mac_header(skb),
> -			skb->dev->mtu + ETH_HEADER_OTHER);
> -}
> -
> -static int tuntap_write(int fd, struct sk_buff *skb, struct uml_net_private *lp)
> -{
> -	return net_write(fd, skb->data, skb->len);
> -}
> -
> -const struct net_kern_info tuntap_kern_info = {
> -	.init			= tuntap_init,
> -	.protocol		= eth_protocol,
> -	.read			= tuntap_read,
> -	.write 			= tuntap_write,
> -};
> -
> -static int tuntap_setup(char *str, char **mac_out, void *data)
> -{
> -	struct tuntap_init *init = data;
> -
> -	*init = ((struct tuntap_init)
> -		{ .dev_name 	= NULL,
> -		  .gate_addr 	= NULL });
> -	if (tap_setup_common(str, "tuntap", &init->dev_name, mac_out,
> -			    &init->gate_addr))
> -		return 0;
> -
> -	return 1;
> -}
> -
> -static struct transport tuntap_transport = {
> -	.list 		= LIST_HEAD_INIT(tuntap_transport.list),
> -	.name 		= "tuntap",
> -	.setup  	= tuntap_setup,
> -	.user 		= &tuntap_user_info,
> -	.kern 		= &tuntap_kern_info,
> -	.private_size 	= sizeof(struct tuntap_data),
> -	.setup_size 	= sizeof(struct tuntap_init),
> -};
> -
> -static int register_tuntap(void)
> -{
> -	register_transport(&tuntap_transport);
> -	return 0;
> -}
> -
> -late_initcall(register_tuntap);
> diff --git a/arch/um/os-Linux/drivers/tuntap_user.c b/arch/um/os-Linux/drivers/tuntap_user.c
> deleted file mode 100644
> index 91f0e27ca3a6..000000000000
> --- a/arch/um/os-Linux/drivers/tuntap_user.c
> +++ /dev/null
> @@ -1,215 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
> - */
> -
> -#include <stdio.h>
> -#include <unistd.h>
> -#include <errno.h>
> -#include <string.h>
> -#include <linux/if_tun.h>
> -#include <net/if.h>
> -#include <sys/ioctl.h>
> -#include <sys/socket.h>
> -#include <sys/wait.h>
> -#include <sys/uio.h>
> -#include <kern_util.h>
> -#include <os.h>
> -#include "tuntap.h"
> -
> -static int tuntap_user_init(void *data, void *dev)
> -{
> -	struct tuntap_data *pri = data;
> -
> -	pri->dev = dev;
> -	return 0;
> -}
> -
> -static void tuntap_add_addr(unsigned char *addr, unsigned char *netmask,
> -			    void *data)
> -{
> -	struct tuntap_data *pri = data;
> -
> -	tap_check_ips(pri->gate_addr, addr);
> -	if ((pri->fd == -1) || pri->fixed_config)
> -		return;
> -	open_addr(addr, netmask, pri->dev_name);
> -}
> -
> -static void tuntap_del_addr(unsigned char *addr, unsigned char *netmask,
> -			    void *data)
> -{
> -	struct tuntap_data *pri = data;
> -
> -	if ((pri->fd == -1) || pri->fixed_config)
> -		return;
> -	close_addr(addr, netmask, pri->dev_name);
> -}
> -
> -struct tuntap_pre_exec_data {
> -	int stdout_fd;
> -	int close_me;
> -};
> -
> -static void tuntap_pre_exec(void *arg)
> -{
> -	struct tuntap_pre_exec_data *data = arg;
> -
> -	dup2(data->stdout_fd, 1);
> -	close(data->close_me);
> -}
> -
> -static int tuntap_open_tramp(char *gate, int *fd_out, int me, int remote,
> -			     char *buffer, int buffer_len, int *used_out)
> -{
> -	struct tuntap_pre_exec_data data;
> -	char version_buf[sizeof("nnnnn\0")];
> -	char *argv[] = { "uml_net", version_buf, "tuntap", "up", gate,
> -			 NULL };
> -	char buf[CMSG_SPACE(sizeof(*fd_out))];
> -	struct msghdr msg;
> -	struct cmsghdr *cmsg;
> -	struct iovec iov;
> -	int pid, n, err;
> -
> -	sprintf(version_buf, "%d", UML_NET_VERSION);
> -
> -	data.stdout_fd = remote;
> -	data.close_me = me;
> -
> -	pid = run_helper(tuntap_pre_exec, &data, argv);
> -
> -	if (pid < 0)
> -		return pid;
> -
> -	close(remote);
> -
> -	msg.msg_name = NULL;
> -	msg.msg_namelen = 0;
> -	if (buffer != NULL) {
> -		iov = ((struct iovec) { buffer, buffer_len });
> -		msg.msg_iov = &iov;
> -		msg.msg_iovlen = 1;
> -	}
> -	else {
> -		msg.msg_iov = NULL;
> -		msg.msg_iovlen = 0;
> -	}
> -	msg.msg_control = buf;
> -	msg.msg_controllen = sizeof(buf);
> -	msg.msg_flags = 0;
> -	n = recvmsg(me, &msg, 0);
> -	*used_out = n;
> -	if (n < 0) {
> -		err = -errno;
> -		printk(UM_KERN_ERR "tuntap_open_tramp : recvmsg failed - "
> -		       "errno = %d\n", errno);
> -		return err;
> -	}
> -	helper_wait(pid);
> -
> -	cmsg = CMSG_FIRSTHDR(&msg);
> -	if (cmsg == NULL) {
> -		printk(UM_KERN_ERR "tuntap_open_tramp : didn't receive a "
> -		       "message\n");
> -		return -EINVAL;
> -	}
> -	if ((cmsg->cmsg_level != SOL_SOCKET) ||
> -	   (cmsg->cmsg_type != SCM_RIGHTS)) {
> -		printk(UM_KERN_ERR "tuntap_open_tramp : didn't receive a "
> -		       "descriptor\n");
> -		return -EINVAL;
> -	}
> -	*fd_out = ((int *) CMSG_DATA(cmsg))[0];
> -	os_set_exec_close(*fd_out);
> -	return 0;
> -}
> -
> -static int tuntap_open(void *data)
> -{
> -	struct ifreq ifr;
> -	struct tuntap_data *pri = data;
> -	char *output, *buffer;
> -	int err, fds[2], len, used;
> -
> -	err = tap_open_common(pri->dev, pri->gate_addr);
> -	if (err < 0)
> -		return err;
> -
> -	if (pri->fixed_config) {
> -		pri->fd = os_open_file("/dev/net/tun",
> -				       of_cloexec(of_rdwr(OPENFLAGS())), 0);
> -		if (pri->fd < 0) {
> -			printk(UM_KERN_ERR "Failed to open /dev/net/tun, "
> -			       "err = %d\n", -pri->fd);
> -			return pri->fd;
> -		}
> -		memset(&ifr, 0, sizeof(ifr));
> -		ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
> -		strscpy(ifr.ifr_name, pri->dev_name);
> -		if (ioctl(pri->fd, TUNSETIFF, &ifr) < 0) {
> -			err = -errno;
> -			printk(UM_KERN_ERR "TUNSETIFF failed, errno = %d\n",
> -			       errno);
> -			close(pri->fd);
> -			return err;
> -		}
> -	}
> -	else {
> -		err = socketpair(AF_UNIX, SOCK_DGRAM, 0, fds);
> -		if (err) {
> -			err = -errno;
> -			printk(UM_KERN_ERR "tuntap_open : socketpair failed - "
> -			       "errno = %d\n", errno);
> -			return err;
> -		}
> -
> -		buffer = get_output_buffer(&len);
> -		if (buffer != NULL)
> -			len--;
> -		used = 0;
> -
> -		err = tuntap_open_tramp(pri->gate_addr, &pri->fd, fds[0],
> -					fds[1], buffer, len, &used);
> -
> -		output = buffer;
> -		if (err < 0) {
> -			printk("%s", output);
> -			free_output_buffer(buffer);
> -			printk(UM_KERN_ERR "tuntap_open_tramp failed - "
> -			       "err = %d\n", -err);
> -			return err;
> -		}
> -
> -		pri->dev_name = uml_strdup(buffer);
> -		output += IFNAMSIZ;
> -		printk("%s", output);
> -		free_output_buffer(buffer);
> -
> -		close(fds[0]);
> -		iter_addresses(pri->dev, open_addr, pri->dev_name);
> -	}
> -
> -	return pri->fd;
> -}
> -
> -static void tuntap_close(int fd, void *data)
> -{
> -	struct tuntap_data *pri = data;
> -
> -	if (!pri->fixed_config)
> -		iter_addresses(pri->dev, close_addr, pri->dev_name);
> -	close(fd);
> -	pri->fd = -1;
> -}
> -
> -const struct net_user_info tuntap_user_info = {
> -	.init		= tuntap_user_init,
> -	.open		= tuntap_open,
> -	.close	 	= tuntap_close,
> -	.remove	 	= NULL,
> -	.add_address	= tuntap_add_addr,
> -	.delete_address = tuntap_del_addr,
> -	.mtu		= ETH_MAX_PACKET,
> -	.max_packet	= ETH_MAX_PACKET + ETH_HEADER_OTHER,
> -};
> diff --git a/arch/um/os-Linux/file.c b/arch/um/os-Linux/file.c
> index a0d01c68ce3e..617886d1fb1e 100644
> --- a/arch/um/os-Linux/file.c
> +++ b/arch/um/os-Linux/file.c
> @@ -106,21 +106,6 @@ int os_get_ifname(int fd, char* namebuf)
>   	return 0;
>   }
>   
> -int os_set_slip(int fd)
> -{
> -	int disc, sencap;
> -
> -	disc = N_SLIP;
> -	if (ioctl(fd, TIOCSETD, &disc) < 0)
> -		return -errno;
> -
> -	sencap = 0;
> -	if (ioctl(fd, SIOCSIFENCAP, &sencap) < 0)
> -		return -errno;
> -
> -	return 0;
> -}
> -
>   int os_mode_fd(int fd, int mode)
>   {
>   	int err;

Acked-By: Anton Ivanov <anton.ivanov at cambridgegreys.com>

I think it is time - it has been marked obsolete for 5 years.

-- 
Anton R. Ivanov
Cambridgegreys Limited. Registered in England. Company Number 10273661
https://www.cambridgegreys.com/



More information about the linux-um mailing list