]>
Commit | Line | Data |
---|---|---|
cd1ae0e4 JD |
1 | /* |
2 | * Copyright (C) 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) | |
3 | * Licensed under the GPL. | |
4 | */ | |
5 | ||
6 | #include <linux/if_arp.h> | |
1da177e4 | 7 | #include "linux/init.h" |
cd1ae0e4 JD |
8 | #include <linux/netdevice.h> |
9 | #include <linux/string.h> | |
1da177e4 LT |
10 | #include "net_kern.h" |
11 | #include "net_user.h" | |
1da177e4 LT |
12 | #include "slirp.h" |
13 | ||
14 | struct slirp_init { | |
15 | struct arg_list_dummy_wrapper argw; /* XXX should be simpler... */ | |
16 | }; | |
17 | ||
18 | void slirp_init(struct net_device *dev, void *data) | |
19 | { | |
20 | struct uml_net_private *private; | |
21 | struct slirp_data *spri; | |
22 | struct slirp_init *init = data; | |
23 | int i; | |
24 | ||
25 | private = dev->priv; | |
26 | spri = (struct slirp_data *) private->user; | |
854e981c PBG |
27 | |
28 | spri->argw = init->argw; | |
29 | spri->pid = -1; | |
30 | spri->slave = -1; | |
31 | spri->dev = dev; | |
32 | ||
33 | slip_proto_init(&spri->slip); | |
1da177e4 LT |
34 | |
35 | dev->init = NULL; | |
36 | dev->hard_header_len = 0; | |
37 | dev->header_cache_update = NULL; | |
38 | dev->hard_header_cache = NULL; | |
39 | dev->hard_header = NULL; | |
40 | dev->addr_len = 0; | |
41 | dev->type = ARPHRD_SLIP; | |
42 | dev->tx_queue_len = 256; | |
43 | dev->flags = IFF_NOARP; | |
44 | printk("SLIRP backend - command line:"); | |
cd1ae0e4 | 45 | for (i = 0; spri->argw.argv[i] != NULL; i++) |
1da177e4 | 46 | printk(" '%s'",spri->argw.argv[i]); |
1da177e4 LT |
47 | printk("\n"); |
48 | } | |
49 | ||
50 | static unsigned short slirp_protocol(struct sk_buff *skbuff) | |
51 | { | |
cd1ae0e4 | 52 | return htons(ETH_P_IP); |
1da177e4 LT |
53 | } |
54 | ||
b53f35a8 | 55 | static int slirp_read(int fd, struct sk_buff *skb, struct uml_net_private *lp) |
1da177e4 | 56 | { |
b53f35a8 JD |
57 | return slirp_user_read(fd, skb_mac_header(skb), skb->dev->mtu, |
58 | (struct slirp_data *) &lp->user); | |
1da177e4 LT |
59 | } |
60 | ||
b53f35a8 | 61 | static int slirp_write(int fd, struct sk_buff *skb, struct uml_net_private *lp) |
1da177e4 | 62 | { |
b53f35a8 JD |
63 | return slirp_user_write(fd, skb->data, skb->len, |
64 | (struct slirp_data *) &lp->user); | |
1da177e4 LT |
65 | } |
66 | ||
5e7672ec | 67 | const struct net_kern_info slirp_kern_info = { |
1da177e4 LT |
68 | .init = slirp_init, |
69 | .protocol = slirp_protocol, | |
70 | .read = slirp_read, | |
71 | .write = slirp_write, | |
72 | }; | |
73 | ||
74 | static int slirp_setup(char *str, char **mac_out, void *data) | |
75 | { | |
76 | struct slirp_init *init = data; | |
77 | int i=0; | |
78 | ||
cd1ae0e4 | 79 | *init = ((struct slirp_init) { .argw = { { "slirp", NULL } } }); |
1da177e4 LT |
80 | |
81 | str = split_if_spec(str, mac_out, NULL); | |
82 | ||
cd1ae0e4 JD |
83 | if (str == NULL) /* no command line given after MAC addr */ |
84 | return 1; | |
1da177e4 LT |
85 | |
86 | do { | |
cd1ae0e4 JD |
87 | if (i >= SLIRP_MAX_ARGS - 1) { |
88 | printk(KERN_WARNING "slirp_setup: truncating slirp " | |
89 | "arguments\n"); | |
1da177e4 LT |
90 | break; |
91 | } | |
92 | init->argw.argv[i++] = str; | |
93 | while(*str && *str!=',') { | |
cd1ae0e4 JD |
94 | if (*str == '_') |
95 | *str=' '; | |
1da177e4 LT |
96 | str++; |
97 | } | |
cd1ae0e4 | 98 | if (*str != ',') |
1da177e4 | 99 | break; |
cd1ae0e4 JD |
100 | *str++ = '\0'; |
101 | } while (1); | |
102 | ||
103 | init->argw.argv[i] = NULL; | |
104 | return 1; | |
1da177e4 LT |
105 | } |
106 | ||
107 | static struct transport slirp_transport = { | |
108 | .list = LIST_HEAD_INIT(slirp_transport.list), | |
109 | .name = "slirp", | |
110 | .setup = slirp_setup, | |
111 | .user = &slirp_user_info, | |
112 | .kern = &slirp_kern_info, | |
113 | .private_size = sizeof(struct slirp_data), | |
114 | .setup_size = sizeof(struct slirp_init), | |
115 | }; | |
116 | ||
117 | static int register_slirp(void) | |
118 | { | |
119 | register_transport(&slirp_transport); | |
f4c57a78 | 120 | return 0; |
1da177e4 LT |
121 | } |
122 | ||
8210fd2a | 123 | late_initcall(register_slirp); |