Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/um/drivers/daemon_kern.c
10817 views
1
/*
2
* Copyright (C) 2001 Lennert Buytenhek ([email protected]) and
3
* James Leu ([email protected]).
4
* Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com)
5
* Copyright (C) 2001 by various other people who didn't put their name here.
6
* Licensed under the GPL.
7
*/
8
9
#include "linux/init.h"
10
#include <linux/netdevice.h>
11
#include "net_kern.h"
12
#include "daemon.h"
13
14
struct daemon_init {
15
char *sock_type;
16
char *ctl_sock;
17
};
18
19
static void daemon_init(struct net_device *dev, void *data)
20
{
21
struct uml_net_private *pri;
22
struct daemon_data *dpri;
23
struct daemon_init *init = data;
24
25
pri = netdev_priv(dev);
26
dpri = (struct daemon_data *) pri->user;
27
dpri->sock_type = init->sock_type;
28
dpri->ctl_sock = init->ctl_sock;
29
dpri->fd = -1;
30
dpri->control = -1;
31
dpri->dev = dev;
32
/* We will free this pointer. If it contains crap we're burned. */
33
dpri->ctl_addr = NULL;
34
dpri->data_addr = NULL;
35
dpri->local_addr = NULL;
36
37
printk("daemon backend (uml_switch version %d) - %s:%s",
38
SWITCH_VERSION, dpri->sock_type, dpri->ctl_sock);
39
printk("\n");
40
}
41
42
static int daemon_read(int fd, struct sk_buff *skb, struct uml_net_private *lp)
43
{
44
return net_recvfrom(fd, skb_mac_header(skb),
45
skb->dev->mtu + ETH_HEADER_OTHER);
46
}
47
48
static int daemon_write(int fd, struct sk_buff *skb, struct uml_net_private *lp)
49
{
50
return daemon_user_write(fd, skb->data, skb->len,
51
(struct daemon_data *) &lp->user);
52
}
53
54
static const struct net_kern_info daemon_kern_info = {
55
.init = daemon_init,
56
.protocol = eth_protocol,
57
.read = daemon_read,
58
.write = daemon_write,
59
};
60
61
static int daemon_setup(char *str, char **mac_out, void *data)
62
{
63
struct daemon_init *init = data;
64
char *remain;
65
66
*init = ((struct daemon_init)
67
{ .sock_type = "unix",
68
.ctl_sock = "/tmp/uml.ctl" });
69
70
remain = split_if_spec(str, mac_out, &init->sock_type, &init->ctl_sock,
71
NULL);
72
if (remain != NULL)
73
printk(KERN_WARNING "daemon_setup : Ignoring data socket "
74
"specification\n");
75
76
return 1;
77
}
78
79
static struct transport daemon_transport = {
80
.list = LIST_HEAD_INIT(daemon_transport.list),
81
.name = "daemon",
82
.setup = daemon_setup,
83
.user = &daemon_user_info,
84
.kern = &daemon_kern_info,
85
.private_size = sizeof(struct daemon_data),
86
.setup_size = sizeof(struct daemon_init),
87
};
88
89
static int register_daemon(void)
90
{
91
register_transport(&daemon_transport);
92
return 0;
93
}
94
95
late_initcall(register_daemon);
96
97