xref: /openbmc/linux/arch/um/drivers/daemon_kern.c (revision b0cbccf4)
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