1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * Copyright (C) 2001 Lennert Buytenhek (buytenh@gnu.org) and |
4 | * James Leu (jleu@mindspring.net). |
5 | * Copyright (C) 2001 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) |
6 | * Copyright (C) 2001 by various other people who didn't put their name here. |
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, buf: skb->data, len: skb->len, |
51 | pri: (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 = CONFIG_UML_NET_DAEMON_DEFAULT_SOCK }); |
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 | |