1dbddf429SAlex Dewar // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and
41da177e4SLinus Torvalds * James Leu (jleu@mindspring.net).
5cd1ae0e4SJeff Dike * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
61da177e4SLinus Torvalds * Copyright (C) 2001 by various other people who didn't put their name here.
71da177e4SLinus Torvalds */
81da177e4SLinus Torvalds
937185b33SAl Viro #include <linux/init.h>
10cd1ae0e4SJeff Dike #include <linux/netdevice.h>
1137185b33SAl Viro #include <net_kern.h>
121da177e4SLinus Torvalds #include "daemon.h"
131da177e4SLinus Torvalds
141da177e4SLinus Torvalds struct daemon_init {
151da177e4SLinus Torvalds char *sock_type;
161da177e4SLinus Torvalds char *ctl_sock;
171da177e4SLinus Torvalds };
181da177e4SLinus Torvalds
daemon_init(struct net_device * dev,void * data)1942947cb9SPaolo 'Blaisorblade' Giarrusso static void daemon_init(struct net_device *dev, void *data)
201da177e4SLinus Torvalds {
211da177e4SLinus Torvalds struct uml_net_private *pri;
221da177e4SLinus Torvalds struct daemon_data *dpri;
231da177e4SLinus Torvalds struct daemon_init *init = data;
241da177e4SLinus Torvalds
2517c324faSWang Chen pri = netdev_priv(dev);
261da177e4SLinus Torvalds dpri = (struct daemon_data *) pri->user;
271da177e4SLinus Torvalds dpri->sock_type = init->sock_type;
281da177e4SLinus Torvalds dpri->ctl_sock = init->ctl_sock;
291da177e4SLinus Torvalds dpri->fd = -1;
301da177e4SLinus Torvalds dpri->control = -1;
311da177e4SLinus Torvalds dpri->dev = dev;
32c42791b6SPaolo 'Blaisorblade' Giarrusso /* We will free this pointer. If it contains crap we're burned. */
33c42791b6SPaolo 'Blaisorblade' Giarrusso dpri->ctl_addr = NULL;
34c42791b6SPaolo 'Blaisorblade' Giarrusso dpri->data_addr = NULL;
35c42791b6SPaolo 'Blaisorblade' Giarrusso dpri->local_addr = NULL;
361da177e4SLinus Torvalds
371da177e4SLinus Torvalds printk("daemon backend (uml_switch version %d) - %s:%s",
381da177e4SLinus Torvalds SWITCH_VERSION, dpri->sock_type, dpri->ctl_sock);
391da177e4SLinus Torvalds printk("\n");
401da177e4SLinus Torvalds }
411da177e4SLinus Torvalds
daemon_read(int fd,struct sk_buff * skb,struct uml_net_private * lp)42b53f35a8SJeff Dike static int daemon_read(int fd, struct sk_buff *skb, struct uml_net_private *lp)
431da177e4SLinus Torvalds {
44b53f35a8SJeff Dike return net_recvfrom(fd, skb_mac_header(skb),
45b53f35a8SJeff Dike skb->dev->mtu + ETH_HEADER_OTHER);
461da177e4SLinus Torvalds }
471da177e4SLinus Torvalds
daemon_write(int fd,struct sk_buff * skb,struct uml_net_private * lp)48b53f35a8SJeff Dike static int daemon_write(int fd, struct sk_buff *skb, struct uml_net_private *lp)
491da177e4SLinus Torvalds {
50b53f35a8SJeff Dike return daemon_user_write(fd, skb->data, skb->len,
51cd1ae0e4SJeff Dike (struct daemon_data *) &lp->user);
521da177e4SLinus Torvalds }
531da177e4SLinus Torvalds
545e7672ecSJeff Dike static const struct net_kern_info daemon_kern_info = {
551da177e4SLinus Torvalds .init = daemon_init,
561da177e4SLinus Torvalds .protocol = eth_protocol,
571da177e4SLinus Torvalds .read = daemon_read,
581da177e4SLinus Torvalds .write = daemon_write,
591da177e4SLinus Torvalds };
601da177e4SLinus Torvalds
daemon_setup(char * str,char ** mac_out,void * data)6142947cb9SPaolo 'Blaisorblade' Giarrusso static int daemon_setup(char *str, char **mac_out, void *data)
621da177e4SLinus Torvalds {
631da177e4SLinus Torvalds struct daemon_init *init = data;
641da177e4SLinus Torvalds char *remain;
651da177e4SLinus Torvalds
661da177e4SLinus Torvalds *init = ((struct daemon_init)
671da177e4SLinus Torvalds { .sock_type = "unix",
68*b0cbccf4SJohannes Berg .ctl_sock = CONFIG_UML_NET_DAEMON_DEFAULT_SOCK });
691da177e4SLinus Torvalds
701da177e4SLinus Torvalds remain = split_if_spec(str, mac_out, &init->sock_type, &init->ctl_sock,
711da177e4SLinus Torvalds NULL);
721da177e4SLinus Torvalds if (remain != NULL)
731da177e4SLinus Torvalds printk(KERN_WARNING "daemon_setup : Ignoring data socket "
741da177e4SLinus Torvalds "specification\n");
751da177e4SLinus Torvalds
76cd1ae0e4SJeff Dike return 1;
771da177e4SLinus Torvalds }
781da177e4SLinus Torvalds
791da177e4SLinus Torvalds static struct transport daemon_transport = {
801da177e4SLinus Torvalds .list = LIST_HEAD_INIT(daemon_transport.list),
811da177e4SLinus Torvalds .name = "daemon",
821da177e4SLinus Torvalds .setup = daemon_setup,
831da177e4SLinus Torvalds .user = &daemon_user_info,
841da177e4SLinus Torvalds .kern = &daemon_kern_info,
851da177e4SLinus Torvalds .private_size = sizeof(struct daemon_data),
861da177e4SLinus Torvalds .setup_size = sizeof(struct daemon_init),
871da177e4SLinus Torvalds };
881da177e4SLinus Torvalds
register_daemon(void)891da177e4SLinus Torvalds static int register_daemon(void)
901da177e4SLinus Torvalds {
911da177e4SLinus Torvalds register_transport(&daemon_transport);
92f4c57a78SJeff Dike return 0;
931da177e4SLinus Torvalds }
941da177e4SLinus Torvalds
958210fd2aSJeff Dike late_initcall(register_daemon);
96