Commit b53f35a8093e6aed7e8e880eaa0b89a3d2fdfb0a
Committed by
Linus Torvalds
1 parent
cd1ae0e49b
Exists in
master
and in
7 other branches
uml: network driver MTU cleanups
A bunch of MTU-related cleanups in the network code. First, there is the addition of the notion of a maximally-sized packet, which is the MTU plus headers. This is used to size the skb that will receive a packet. This allows ether_adjust_skb to go away, as it was used to resize the skb after it was allocated. Since the skb passed into the low-level read routine is no longer resized, and possibly reallocated, there, they (and the write routines) don't need to get an sk_buff **. They just need the sk_buff * now. The callers of ether_adjust_skb still need to do the skb_put, so that's now inlined. The MAX_PACKET definitions in most of the drivers are gone. The set_mtu methods were all the same and did nothing, so they can be removed. The ethertap driver had a typo which doubled the size of the packet rather than adding two bytes to it. It also wasn't defining its setup_size, causing a zero-byte kmalloc and crash when the invalid pointer returned from kmalloc was dereferenced. Signed-off-by: Jeff Dike <jdike@linux.intel.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 19 changed files with 80 additions and 188 deletions Side-by-side Diff
- arch/um/drivers/daemon_kern.c
- arch/um/drivers/daemon_user.c
- arch/um/drivers/mcast_kern.c
- arch/um/drivers/mcast_user.c
- arch/um/drivers/net_kern.c
- arch/um/drivers/pcap_kern.c
- arch/um/drivers/pcap_user.c
- arch/um/drivers/slip_kern.c
- arch/um/drivers/slip_user.c
- arch/um/drivers/slirp_kern.c
- arch/um/drivers/slirp_user.c
- arch/um/drivers/vde_kern.c
- arch/um/drivers/vde_user.c
- arch/um/include/net_kern.h
- arch/um/include/net_user.h
- arch/um/os-Linux/drivers/ethertap_kern.c
- arch/um/os-Linux/drivers/ethertap_user.c
- arch/um/os-Linux/drivers/tuntap_kern.c
- arch/um/os-Linux/drivers/tuntap_user.c
arch/um/drivers/daemon_kern.c
... | ... | @@ -39,20 +39,15 @@ |
39 | 39 | printk("\n"); |
40 | 40 | } |
41 | 41 | |
42 | -static int daemon_read(int fd, struct sk_buff **skb, | |
43 | - struct uml_net_private *lp) | |
42 | +static int daemon_read(int fd, struct sk_buff *skb, struct uml_net_private *lp) | |
44 | 43 | { |
45 | - *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER); | |
46 | - if (*skb == NULL) | |
47 | - return -ENOMEM; | |
48 | - return net_recvfrom(fd, skb_mac_header(*skb), | |
49 | - (*skb)->dev->mtu + ETH_HEADER_OTHER); | |
44 | + return net_recvfrom(fd, skb_mac_header(skb), | |
45 | + skb->dev->mtu + ETH_HEADER_OTHER); | |
50 | 46 | } |
51 | 47 | |
52 | -static int daemon_write(int fd, struct sk_buff **skb, | |
53 | - struct uml_net_private *lp) | |
48 | +static int daemon_write(int fd, struct sk_buff *skb, struct uml_net_private *lp) | |
54 | 49 | { |
55 | - return daemon_user_write(fd, (*skb)->data, (*skb)->len, | |
50 | + return daemon_user_write(fd, skb->data, skb->len, | |
56 | 51 | (struct daemon_data *) &lp->user); |
57 | 52 | } |
58 | 53 |
arch/um/drivers/daemon_user.c
... | ... | @@ -19,8 +19,6 @@ |
19 | 19 | #include "um_malloc.h" |
20 | 20 | #include "user.h" |
21 | 21 | |
22 | -#define MAX_PACKET (ETH_MAX_PACKET + ETH_HEADER_OTHER) | |
23 | - | |
24 | 22 | enum request_type { REQ_NEW_CONTROL }; |
25 | 23 | |
26 | 24 | #define SWITCH_MAGIC 0xfeedface |
27 | 25 | |
28 | 26 | |
... | ... | @@ -184,19 +182,14 @@ |
184 | 182 | return net_sendto(fd, buf, len, data_addr, sizeof(*data_addr)); |
185 | 183 | } |
186 | 184 | |
187 | -static int daemon_set_mtu(int mtu, void *data) | |
188 | -{ | |
189 | - return mtu; | |
190 | -} | |
191 | - | |
192 | 185 | const struct net_user_info daemon_user_info = { |
193 | 186 | .init = daemon_user_init, |
194 | 187 | .open = daemon_open, |
195 | 188 | .close = NULL, |
196 | 189 | .remove = daemon_remove, |
197 | - .set_mtu = daemon_set_mtu, | |
198 | 190 | .add_address = NULL, |
199 | 191 | .delete_address = NULL, |
200 | - .max_packet = MAX_PACKET - ETH_HEADER_OTHER | |
192 | + .mtu = ETH_MAX_PACKET, | |
193 | + .max_packet = ETH_MAX_PACKET + ETH_HEADER_OTHER, | |
201 | 194 | }; |
arch/um/drivers/mcast_kern.c
... | ... | @@ -39,18 +39,15 @@ |
39 | 39 | dpri->addr, dpri->port, dpri->ttl); |
40 | 40 | } |
41 | 41 | |
42 | -static int mcast_read(int fd, struct sk_buff **skb, struct uml_net_private *lp) | |
42 | +static int mcast_read(int fd, struct sk_buff *skb, struct uml_net_private *lp) | |
43 | 43 | { |
44 | - *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER); | |
45 | - if (*skb == NULL) | |
46 | - return -ENOMEM; | |
47 | - return net_recvfrom(fd, skb_mac_header(*skb), | |
48 | - (*skb)->dev->mtu + ETH_HEADER_OTHER); | |
44 | + return net_recvfrom(fd, skb_mac_header(skb), | |
45 | + skb->dev->mtu + ETH_HEADER_OTHER); | |
49 | 46 | } |
50 | 47 | |
51 | -static int mcast_write(int fd, struct sk_buff **skb, struct uml_net_private *lp) | |
48 | +static int mcast_write(int fd, struct sk_buff *skb, struct uml_net_private *lp) | |
52 | 49 | { |
53 | - return mcast_user_write(fd, (*skb)->data, (*skb)->len, | |
50 | + return mcast_user_write(fd, skb->data, skb->len, | |
54 | 51 | (struct mcast_data *) &lp->user); |
55 | 52 | } |
56 | 53 |
arch/um/drivers/mcast_user.c
... | ... | @@ -20,8 +20,6 @@ |
20 | 20 | #include "um_malloc.h" |
21 | 21 | #include "user.h" |
22 | 22 | |
23 | -#define MAX_PACKET (ETH_MAX_PACKET + ETH_HEADER_OTHER) | |
24 | - | |
25 | 23 | static struct sockaddr_in *new_addr(char *addr, unsigned short port) |
26 | 24 | { |
27 | 25 | struct sockaddr_in *sin; |
28 | 26 | |
29 | 27 | |
... | ... | @@ -154,19 +152,14 @@ |
154 | 152 | return net_sendto(fd, buf, len, data_addr, sizeof(*data_addr)); |
155 | 153 | } |
156 | 154 | |
157 | -static int mcast_set_mtu(int mtu, void *data) | |
158 | -{ | |
159 | - return mtu; | |
160 | -} | |
161 | - | |
162 | 155 | const struct net_user_info mcast_user_info = { |
163 | 156 | .init = mcast_user_init, |
164 | 157 | .open = mcast_open, |
165 | 158 | .close = mcast_close, |
166 | 159 | .remove = mcast_remove, |
167 | - .set_mtu = mcast_set_mtu, | |
168 | 160 | .add_address = NULL, |
169 | 161 | .delete_address = NULL, |
170 | - .max_packet = MAX_PACKET - ETH_HEADER_OTHER | |
162 | + .mtu = ETH_MAX_PACKET, | |
163 | + .max_packet = ETH_MAX_PACKET + ETH_HEADER_OTHER, | |
171 | 164 | }; |
arch/um/drivers/net_kern.c
... | ... | @@ -41,16 +41,16 @@ |
41 | 41 | struct sk_buff *skb; |
42 | 42 | |
43 | 43 | /* If we can't allocate memory, try again next round. */ |
44 | - skb = dev_alloc_skb(dev->mtu); | |
44 | + skb = dev_alloc_skb(lp->max_packet); | |
45 | 45 | if (skb == NULL) { |
46 | 46 | lp->stats.rx_dropped++; |
47 | 47 | return 0; |
48 | 48 | } |
49 | 49 | |
50 | 50 | skb->dev = dev; |
51 | - skb_put(skb, dev->mtu); | |
51 | + skb_put(skb, lp->max_packet); | |
52 | 52 | skb_reset_mac_header(skb); |
53 | - pkt_len = (*lp->read)(lp->fd, &skb, lp); | |
53 | + pkt_len = (*lp->read)(lp->fd, skb, lp); | |
54 | 54 | |
55 | 55 | if (pkt_len > 0) { |
56 | 56 | skb_trim(skb, pkt_len); |
... | ... | @@ -178,7 +178,7 @@ |
178 | 178 | |
179 | 179 | spin_lock_irqsave(&lp->lock, flags); |
180 | 180 | |
181 | - len = (*lp->write)(lp->fd, &skb, lp); | |
181 | + len = (*lp->write)(lp->fd, skb, lp); | |
182 | 182 | |
183 | 183 | if (len == skb->len) { |
184 | 184 | lp->stats.tx_packets++; |
185 | 185 | |
... | ... | @@ -240,22 +240,9 @@ |
240 | 240 | |
241 | 241 | static int uml_net_change_mtu(struct net_device *dev, int new_mtu) |
242 | 242 | { |
243 | - struct uml_net_private *lp = dev->priv; | |
244 | - int err = 0; | |
245 | - | |
246 | - spin_lock_irq(&lp->lock); | |
247 | - | |
248 | - new_mtu = (*lp->set_mtu)(new_mtu, &lp->user); | |
249 | - if (new_mtu < 0) { | |
250 | - err = new_mtu; | |
251 | - goto out; | |
252 | - } | |
253 | - | |
254 | 243 | dev->mtu = new_mtu; |
255 | 244 | |
256 | - out: | |
257 | - spin_unlock_irq(&lp->lock); | |
258 | - return err; | |
245 | + return 0; | |
259 | 246 | } |
260 | 247 | |
261 | 248 | static void uml_net_get_drvinfo(struct net_device *dev, |
... | ... | @@ -427,6 +414,7 @@ |
427 | 414 | .dev = dev, |
428 | 415 | .fd = -1, |
429 | 416 | .mac = { 0xfe, 0xfd, 0x0, 0x0, 0x0, 0x0}, |
417 | + .max_packet = transport->user->max_packet, | |
430 | 418 | .protocol = transport->kern->protocol, |
431 | 419 | .open = transport->user->open, |
432 | 420 | .close = transport->user->close, |
... | ... | @@ -434,8 +422,7 @@ |
434 | 422 | .read = transport->kern->read, |
435 | 423 | .write = transport->kern->write, |
436 | 424 | .add_address = transport->user->add_address, |
437 | - .delete_address = transport->user->delete_address, | |
438 | - .set_mtu = transport->user->set_mtu }); | |
425 | + .delete_address = transport->user->delete_address }); | |
439 | 426 | |
440 | 427 | init_timer(&lp->tl); |
441 | 428 | spin_lock_init(&lp->lock); |
... | ... | @@ -447,7 +434,7 @@ |
447 | 434 | goto out_unregister; |
448 | 435 | |
449 | 436 | set_ether_mac(dev, device->mac); |
450 | - dev->mtu = transport->user->max_packet; | |
437 | + dev->mtu = transport->user->mtu; | |
451 | 438 | dev->open = uml_net_open; |
452 | 439 | dev->hard_start_xmit = uml_net_start_xmit; |
453 | 440 | dev->stop = uml_net_close; |
... | ... | @@ -806,19 +793,6 @@ |
806 | 793 | } |
807 | 794 | |
808 | 795 | __uml_exitcall(close_devices); |
809 | - | |
810 | -struct sk_buff *ether_adjust_skb(struct sk_buff *skb, int extra) | |
811 | -{ | |
812 | - if ((skb != NULL) && (skb_tailroom(skb) < extra)) { | |
813 | - struct sk_buff *skb2; | |
814 | - | |
815 | - skb2 = skb_copy_expand(skb, 0, extra, GFP_ATOMIC); | |
816 | - dev_kfree_skb(skb); | |
817 | - skb = skb2; | |
818 | - } | |
819 | - if (skb != NULL) skb_put(skb, extra); | |
820 | - return skb; | |
821 | -} | |
822 | 796 | |
823 | 797 | void iter_addresses(void *d, void (*cb)(unsigned char *, unsigned char *, |
824 | 798 | void *), |
arch/um/drivers/pcap_kern.c
... | ... | @@ -31,19 +31,14 @@ |
31 | 31 | printk("pcap backend, host interface %s\n", ppri->host_if); |
32 | 32 | } |
33 | 33 | |
34 | -static int pcap_read(int fd, struct sk_buff **skb, | |
35 | - struct uml_net_private *lp) | |
34 | +static int pcap_read(int fd, struct sk_buff *skb, struct uml_net_private *lp) | |
36 | 35 | { |
37 | - *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER); | |
38 | - if (*skb == NULL) | |
39 | - return -ENOMEM; | |
40 | - | |
41 | - return pcap_user_read(fd, skb_mac_header(*skb), | |
42 | - (*skb)->dev->mtu + ETH_HEADER_OTHER, | |
36 | + return pcap_user_read(fd, skb_mac_header(skb), | |
37 | + skb->dev->mtu + ETH_HEADER_OTHER, | |
43 | 38 | (struct pcap_data *) &lp->user); |
44 | 39 | } |
45 | 40 | |
46 | -static int pcap_write(int fd, struct sk_buff **skb, struct uml_net_private *lp) | |
41 | +static int pcap_write(int fd, struct sk_buff *skb, struct uml_net_private *lp) | |
47 | 42 | { |
48 | 43 | return -EPERM; |
49 | 44 | } |
arch/um/drivers/pcap_user.c
... | ... | @@ -13,8 +13,6 @@ |
13 | 13 | #include "um_malloc.h" |
14 | 14 | #include "user.h" |
15 | 15 | |
16 | -#define MAX_PACKET (ETH_MAX_PACKET + ETH_HEADER_OTHER) | |
17 | - | |
18 | 16 | #define PCAP_FD(p) (*(int *)(p)) |
19 | 17 | |
20 | 18 | static int pcap_user_init(void *data, void *dev) |
... | ... | @@ -23,7 +21,8 @@ |
23 | 21 | pcap_t *p; |
24 | 22 | char errors[PCAP_ERRBUF_SIZE]; |
25 | 23 | |
26 | - p = pcap_open_live(pri->host_if, MAX_PACKET, pri->promisc, 0, errors); | |
24 | + p = pcap_open_live(pri->host_if, ETH_MAX_PACKET + ETH_HEADER_OTHER, | |
25 | + pri->promisc, 0, errors); | |
27 | 26 | if (p == NULL) { |
28 | 27 | printk(UM_KERN_ERR "pcap_user_init : pcap_open_live failed - " |
29 | 28 | "'%s'\n", errors); |
30 | 29 | |
... | ... | @@ -133,9 +132,9 @@ |
133 | 132 | .open = pcap_open, |
134 | 133 | .close = NULL, |
135 | 134 | .remove = pcap_remove, |
136 | - .set_mtu = NULL, | |
137 | 135 | .add_address = NULL, |
138 | 136 | .delete_address = NULL, |
139 | - .max_packet = MAX_PACKET - ETH_HEADER_OTHER | |
137 | + .mtu = ETH_MAX_PACKET, | |
138 | + .max_packet = ETH_MAX_PACKET + ETH_HEADER_OTHER, | |
140 | 139 | }; |
arch/um/drivers/slip_kern.c
... | ... | @@ -47,17 +47,15 @@ |
47 | 47 | return htons(ETH_P_IP); |
48 | 48 | } |
49 | 49 | |
50 | -static int slip_read(int fd, struct sk_buff **skb, | |
51 | - struct uml_net_private *lp) | |
50 | +static int slip_read(int fd, struct sk_buff *skb, struct uml_net_private *lp) | |
52 | 51 | { |
53 | - return slip_user_read(fd, skb_mac_header(*skb), (*skb)->dev->mtu, | |
52 | + return slip_user_read(fd, skb_mac_header(skb), skb->dev->mtu, | |
54 | 53 | (struct slip_data *) &lp->user); |
55 | 54 | } |
56 | 55 | |
57 | -static int slip_write(int fd, struct sk_buff **skb, | |
58 | - struct uml_net_private *lp) | |
56 | +static int slip_write(int fd, struct sk_buff *skb, struct uml_net_private *lp) | |
59 | 57 | { |
60 | - return slip_user_write(fd, (*skb)->data, (*skb)->len, | |
58 | + return slip_user_write(fd, skb->data, skb->len, | |
61 | 59 | (struct slip_data *) &lp->user); |
62 | 60 | } |
63 | 61 |
arch/um/drivers/slip_user.c
... | ... | @@ -230,11 +230,6 @@ |
230 | 230 | return slip_proto_write(fd, buf, len, &pri->slip); |
231 | 231 | } |
232 | 232 | |
233 | -static int slip_set_mtu(int mtu, void *data) | |
234 | -{ | |
235 | - return mtu; | |
236 | -} | |
237 | - | |
238 | 233 | static void slip_add_addr(unsigned char *addr, unsigned char *netmask, |
239 | 234 | void *data) |
240 | 235 | { |
241 | 236 | |
... | ... | @@ -260,9 +255,9 @@ |
260 | 255 | .open = slip_open, |
261 | 256 | .close = slip_close, |
262 | 257 | .remove = NULL, |
263 | - .set_mtu = slip_set_mtu, | |
264 | 258 | .add_address = slip_add_addr, |
265 | 259 | .delete_address = slip_del_addr, |
266 | - .max_packet = BUF_SIZE | |
260 | + .mtu = BUF_SIZE, | |
261 | + .max_packet = BUF_SIZE, | |
267 | 262 | }; |
arch/um/drivers/slirp_kern.c
... | ... | @@ -52,18 +52,16 @@ |
52 | 52 | return htons(ETH_P_IP); |
53 | 53 | } |
54 | 54 | |
55 | -static int slirp_read(int fd, struct sk_buff **skb, | |
56 | - struct uml_net_private *lp) | |
55 | +static int slirp_read(int fd, struct sk_buff *skb, struct uml_net_private *lp) | |
57 | 56 | { |
58 | - return slirp_user_read(fd, skb_mac_header(*skb), (*skb)->dev->mtu, | |
59 | - (struct slirp_data *) &lp->user); | |
57 | + return slirp_user_read(fd, skb_mac_header(skb), skb->dev->mtu, | |
58 | + (struct slirp_data *) &lp->user); | |
60 | 59 | } |
61 | 60 | |
62 | -static int slirp_write(int fd, struct sk_buff **skb, | |
63 | - struct uml_net_private *lp) | |
61 | +static int slirp_write(int fd, struct sk_buff *skb, struct uml_net_private *lp) | |
64 | 62 | { |
65 | - return slirp_user_write(fd, (*skb)->data, (*skb)->len, | |
66 | - (struct slirp_data *) &lp->user); | |
63 | + return slirp_user_write(fd, skb->data, skb->len, | |
64 | + (struct slirp_data *) &lp->user); | |
67 | 65 | } |
68 | 66 | |
69 | 67 | const struct net_kern_info slirp_kern_info = { |
arch/um/drivers/slirp_user.c
... | ... | @@ -124,19 +124,14 @@ |
124 | 124 | return slip_proto_write(fd, buf, len, &pri->slip); |
125 | 125 | } |
126 | 126 | |
127 | -static int slirp_set_mtu(int mtu, void *data) | |
128 | -{ | |
129 | - return mtu; | |
130 | -} | |
131 | - | |
132 | 127 | const struct net_user_info slirp_user_info = { |
133 | 128 | .init = slirp_user_init, |
134 | 129 | .open = slirp_open, |
135 | 130 | .close = slirp_close, |
136 | 131 | .remove = NULL, |
137 | - .set_mtu = slirp_set_mtu, | |
138 | 132 | .add_address = NULL, |
139 | 133 | .delete_address = NULL, |
140 | - .max_packet = BUF_SIZE | |
134 | + .mtu = BUF_SIZE, | |
135 | + .max_packet = BUF_SIZE, | |
141 | 136 | }; |
arch/um/drivers/vde_kern.c
... | ... | @@ -36,30 +36,25 @@ |
36 | 36 | printk("\n"); |
37 | 37 | } |
38 | 38 | |
39 | -static int vde_read(int fd, struct sk_buff **skb, struct uml_net_private *lp) | |
39 | +static int vde_read(int fd, struct sk_buff *skb, struct uml_net_private *lp) | |
40 | 40 | { |
41 | 41 | struct vde_data *pri = (struct vde_data *) &lp->user; |
42 | 42 | |
43 | - if (pri->conn != NULL) { | |
44 | - *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER); | |
45 | - if (*skb == NULL) | |
46 | - return -ENOMEM; | |
43 | + if (pri->conn != NULL) | |
44 | + return vde_user_read(pri->conn, skb_mac_header(skb), | |
45 | + skb->dev->mtu + ETH_HEADER_OTHER); | |
47 | 46 | |
48 | - return vde_user_read(pri->conn, skb_mac_header(*skb), | |
49 | - (*skb)->dev->mtu + ETH_HEADER_OTHER); | |
50 | - } | |
51 | - | |
52 | 47 | printk(KERN_ERR "vde_read - we have no VDECONN to read from"); |
53 | 48 | return -EBADF; |
54 | 49 | } |
55 | 50 | |
56 | -static int vde_write(int fd, struct sk_buff **skb, struct uml_net_private *lp) | |
51 | +static int vde_write(int fd, struct sk_buff *skb, struct uml_net_private *lp) | |
57 | 52 | { |
58 | 53 | struct vde_data *pri = (struct vde_data *) &lp->user; |
59 | 54 | |
60 | 55 | if (pri->conn != NULL) |
61 | - return vde_user_write((void *)pri->conn, (*skb)->data, | |
62 | - (*skb)->len); | |
56 | + return vde_user_write((void *)pri->conn, skb->data, | |
57 | + skb->len); | |
63 | 58 | |
64 | 59 | printk(KERN_ERR "vde_write - we have no VDECONN to write to"); |
65 | 60 | return -EBADF; |
arch/um/drivers/vde_user.c
... | ... | @@ -12,8 +12,6 @@ |
12 | 12 | #include "user.h" |
13 | 13 | #include "vde.h" |
14 | 14 | |
15 | -#define MAX_PACKET (ETH_MAX_PACKET + ETH_HEADER_OTHER) | |
16 | - | |
17 | 15 | static int vde_user_init(void *data, void *dev) |
18 | 16 | { |
19 | 17 | struct vde_data *pri = data; |
20 | 18 | |
21 | 19 | |
... | ... | @@ -65,20 +63,15 @@ |
65 | 63 | printk(UM_KERN_WARNING "vde_remove - we have no VDECONN to remove"); |
66 | 64 | } |
67 | 65 | |
68 | -static int vde_set_mtu(int mtu, void *data) | |
69 | -{ | |
70 | - return mtu; | |
71 | -} | |
72 | - | |
73 | 66 | const struct net_user_info vde_user_info = { |
74 | 67 | .init = vde_user_init, |
75 | 68 | .open = vde_user_open, |
76 | 69 | .close = NULL, |
77 | 70 | .remove = vde_remove, |
78 | - .set_mtu = vde_set_mtu, | |
79 | 71 | .add_address = NULL, |
80 | 72 | .delete_address = NULL, |
81 | - .max_packet = MAX_PACKET - ETH_HEADER_OTHER | |
73 | + .mtu = ETH_MAX_PACKET, | |
74 | + .max_packet = ETH_MAX_PACKET + ETH_HEADER_OTHER, | |
82 | 75 | }; |
83 | 76 | |
84 | 77 | void vde_init_libstuff(struct vde_data *vpri, struct vde_init *init) |
arch/um/include/net_kern.h
1 | 1 | /* |
2 | - * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) | |
2 | + * Copyright (C) 2002 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) | |
3 | 3 | * Licensed under the GPL |
4 | 4 | */ |
5 | 5 | |
6 | 6 | |
7 | 7 | |
8 | 8 | |
... | ... | @@ -30,24 +30,24 @@ |
30 | 30 | struct work_struct work; |
31 | 31 | int fd; |
32 | 32 | unsigned char mac[ETH_ALEN]; |
33 | + int max_packet; | |
33 | 34 | unsigned short (*protocol)(struct sk_buff *); |
34 | 35 | int (*open)(void *); |
35 | 36 | void (*close)(int, void *); |
36 | 37 | void (*remove)(void *); |
37 | - int (*read)(int, struct sk_buff **skb, struct uml_net_private *); | |
38 | - int (*write)(int, struct sk_buff **skb, struct uml_net_private *); | |
38 | + int (*read)(int, struct sk_buff *skb, struct uml_net_private *); | |
39 | + int (*write)(int, struct sk_buff *skb, struct uml_net_private *); | |
39 | 40 | |
40 | 41 | void (*add_address)(unsigned char *, unsigned char *, void *); |
41 | 42 | void (*delete_address)(unsigned char *, unsigned char *, void *); |
42 | - int (*set_mtu)(int mtu, void *); | |
43 | 43 | char user[0]; |
44 | 44 | }; |
45 | 45 | |
46 | 46 | struct net_kern_info { |
47 | 47 | void (*init)(struct net_device *, void *); |
48 | 48 | unsigned short (*protocol)(struct sk_buff *); |
49 | - int (*read)(int, struct sk_buff **skb, struct uml_net_private *); | |
50 | - int (*write)(int, struct sk_buff **skb, struct uml_net_private *); | |
49 | + int (*read)(int, struct sk_buff *skb, struct uml_net_private *); | |
50 | + int (*write)(int, struct sk_buff *skb, struct uml_net_private *); | |
51 | 51 | }; |
52 | 52 | |
53 | 53 | struct transport { |
... | ... | @@ -62,7 +62,6 @@ |
62 | 62 | |
63 | 63 | extern struct net_device *ether_init(int); |
64 | 64 | extern unsigned short ether_protocol(struct sk_buff *); |
65 | -extern struct sk_buff *ether_adjust_skb(struct sk_buff *skb, int extra); | |
66 | 65 | extern int tap_setup_common(char *str, char *type, char **dev_name, |
67 | 66 | char **mac_out, char **gate_addr); |
68 | 67 | extern void register_transport(struct transport *new); |
arch/um/include/net_user.h
1 | 1 | /* |
2 | - * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) | |
2 | + * Copyright (C) 2002 - 2007 Jeff Dike (jdike@{addtoit,linux.intel}.com) | |
3 | 3 | * Licensed under the GPL |
4 | 4 | */ |
5 | 5 | |
6 | 6 | |
... | ... | @@ -18,10 +18,10 @@ |
18 | 18 | int (*open)(void *); |
19 | 19 | void (*close)(int, void *); |
20 | 20 | void (*remove)(void *); |
21 | - int (*set_mtu)(int mtu, void *); | |
22 | 21 | void (*add_address)(unsigned char *, unsigned char *, void *); |
23 | 22 | void (*delete_address)(unsigned char *, unsigned char *, void *); |
24 | 23 | int max_packet; |
24 | + int mtu; | |
25 | 25 | }; |
26 | 26 | |
27 | 27 | extern void ether_user_init(void *data, void *dev); |
arch/um/os-Linux/drivers/ethertap_kern.c
... | ... | @@ -36,35 +36,24 @@ |
36 | 36 | printk("\n"); |
37 | 37 | } |
38 | 38 | |
39 | -static int etap_read(int fd, struct sk_buff **skb, struct uml_net_private *lp) | |
39 | +static int etap_read(int fd, struct sk_buff *skb, struct uml_net_private *lp) | |
40 | 40 | { |
41 | 41 | int len; |
42 | 42 | |
43 | - *skb = ether_adjust_skb(*skb, ETH_HEADER_ETHERTAP); | |
44 | - if (*skb == NULL) | |
45 | - return -ENOMEM; | |
46 | - len = net_recvfrom(fd, skb_mac_header(*skb), | |
47 | - (*skb)->dev->mtu + 2 * ETH_HEADER_ETHERTAP); | |
43 | + len = net_recvfrom(fd, skb_mac_header(skb), | |
44 | + skb->dev->mtu + 2 + ETH_HEADER_ETHERTAP); | |
48 | 45 | if (len <= 0) |
49 | - return len; | |
50 | - skb_pull(*skb, 2); | |
46 | + return(len); | |
47 | + | |
48 | + skb_pull(skb, 2); | |
51 | 49 | len -= 2; |
52 | 50 | return len; |
53 | 51 | } |
54 | 52 | |
55 | -static int etap_write(int fd, struct sk_buff **skb, struct uml_net_private *lp) | |
53 | +static int etap_write(int fd, struct sk_buff *skb, struct uml_net_private *lp) | |
56 | 54 | { |
57 | - if (skb_headroom(*skb) < 2) { | |
58 | - struct sk_buff *skb2; | |
59 | - | |
60 | - skb2 = skb_realloc_headroom(*skb, 2); | |
61 | - dev_kfree_skb(*skb); | |
62 | - if (skb2 == NULL) | |
63 | - return -ENOMEM; | |
64 | - *skb = skb2; | |
65 | - } | |
66 | - skb_push(*skb, 2); | |
67 | - return net_send(fd, (*skb)->data, (*skb)->len); | |
55 | + skb_push(skb, 2); | |
56 | + return net_send(fd, skb->data, skb->len); | |
68 | 57 | } |
69 | 58 | |
70 | 59 | const struct net_kern_info ethertap_kern_info = { |
... | ... | @@ -99,6 +88,7 @@ |
99 | 88 | .user = ðertap_user_info, |
100 | 89 | .kern = ðertap_kern_info, |
101 | 90 | .private_size = sizeof(struct ethertap_data), |
91 | + .setup_size = sizeof(struct ethertap_init), | |
102 | 92 | }; |
103 | 93 | |
104 | 94 | static int register_ethertap(void) |
arch/um/os-Linux/drivers/ethertap_user.c
... | ... | @@ -222,11 +222,6 @@ |
222 | 222 | pri->control_fd = -1; |
223 | 223 | } |
224 | 224 | |
225 | -static int etap_set_mtu(int mtu, void *data) | |
226 | -{ | |
227 | - return mtu; | |
228 | -} | |
229 | - | |
230 | 225 | static void etap_add_addr(unsigned char *addr, unsigned char *netmask, |
231 | 226 | void *data) |
232 | 227 | { |
233 | 228 | |
... | ... | @@ -254,9 +249,9 @@ |
254 | 249 | .open = etap_open, |
255 | 250 | .close = etap_close, |
256 | 251 | .remove = NULL, |
257 | - .set_mtu = etap_set_mtu, | |
258 | 252 | .add_address = etap_add_addr, |
259 | 253 | .delete_address = etap_del_addr, |
260 | - .max_packet = MAX_PACKET - ETH_HEADER_ETHERTAP | |
254 | + .mtu = ETH_MAX_PACKET, | |
255 | + .max_packet = ETH_MAX_PACKET + ETH_HEADER_ETHERTAP, | |
261 | 256 | }; |
arch/um/os-Linux/drivers/tuntap_kern.c
... | ... | @@ -35,20 +35,15 @@ |
35 | 35 | printk("\n"); |
36 | 36 | } |
37 | 37 | |
38 | -static int tuntap_read(int fd, struct sk_buff **skb, | |
39 | - struct uml_net_private *lp) | |
38 | +static int tuntap_read(int fd, struct sk_buff *skb, struct uml_net_private *lp) | |
40 | 39 | { |
41 | - *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER); | |
42 | - if (*skb == NULL) | |
43 | - return -ENOMEM; | |
44 | - return net_read(fd, skb_mac_header(*skb), | |
45 | - (*skb)->dev->mtu + ETH_HEADER_OTHER); | |
40 | + return net_read(fd, skb_mac_header(skb), | |
41 | + skb->dev->mtu + ETH_HEADER_OTHER); | |
46 | 42 | } |
47 | 43 | |
48 | -static int tuntap_write(int fd, struct sk_buff **skb, | |
49 | - struct uml_net_private *lp) | |
44 | +static int tuntap_write(int fd, struct sk_buff *skb, struct uml_net_private *lp) | |
50 | 45 | { |
51 | - return net_write(fd, (*skb)->data, (*skb)->len); | |
46 | + return net_write(fd, skb->data, skb->len); | |
52 | 47 | } |
53 | 48 | |
54 | 49 | const struct net_kern_info tuntap_kern_info = { |
arch/um/os-Linux/drivers/tuntap_user.c
... | ... | @@ -18,8 +18,6 @@ |
18 | 18 | #include "tuntap.h" |
19 | 19 | #include "user.h" |
20 | 20 | |
21 | -#define MAX_PACKET ETH_MAX_PACKET | |
22 | - | |
23 | 21 | static int tuntap_user_init(void *data, void *dev) |
24 | 22 | { |
25 | 23 | struct tuntap_data *pri = data; |
26 | 24 | |
27 | 25 | |
... | ... | @@ -206,19 +204,14 @@ |
206 | 204 | pri->fd = -1; |
207 | 205 | } |
208 | 206 | |
209 | -static int tuntap_set_mtu(int mtu, void *data) | |
210 | -{ | |
211 | - return mtu; | |
212 | -} | |
213 | - | |
214 | 207 | const struct net_user_info tuntap_user_info = { |
215 | 208 | .init = tuntap_user_init, |
216 | 209 | .open = tuntap_open, |
217 | 210 | .close = tuntap_close, |
218 | 211 | .remove = NULL, |
219 | - .set_mtu = tuntap_set_mtu, | |
220 | 212 | .add_address = tuntap_add_addr, |
221 | 213 | .delete_address = tuntap_del_addr, |
222 | - .max_packet = MAX_PACKET | |
214 | + .mtu = ETH_MAX_PACKET, | |
215 | + .max_packet = ETH_MAX_PACKET + ETH_HEADER_OTHER, | |
223 | 216 | }; |