diff options
author | Jeff Dike <jdike@addtoit.com> | 2007-10-16 04:27:31 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-10-16 12:43:08 -0400 |
commit | b53f35a8093e6aed7e8e880eaa0b89a3d2fdfb0a (patch) | |
tree | 50e19688753650e27b1f7fc1d48eb8683666e6b7 /arch/um/os-Linux | |
parent | cd1ae0e49bdd814cfaa2e5ab28cff21a30e20085 (diff) |
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>
Diffstat (limited to 'arch/um/os-Linux')
-rw-r--r-- | arch/um/os-Linux/drivers/ethertap_kern.c | 30 | ||||
-rw-r--r-- | arch/um/os-Linux/drivers/ethertap_user.c | 9 | ||||
-rw-r--r-- | arch/um/os-Linux/drivers/tuntap_kern.c | 15 | ||||
-rw-r--r-- | arch/um/os-Linux/drivers/tuntap_user.c | 11 |
4 files changed, 19 insertions, 46 deletions
diff --git a/arch/um/os-Linux/drivers/ethertap_kern.c b/arch/um/os-Linux/drivers/ethertap_kern.c index 542bcc58354c..04f11b9f1ac0 100644 --- a/arch/um/os-Linux/drivers/ethertap_kern.c +++ b/arch/um/os-Linux/drivers/ethertap_kern.c | |||
@@ -36,35 +36,24 @@ static void etap_init(struct net_device *dev, void *data) | |||
36 | printk("\n"); | 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 | int len; | 41 | int len; |
42 | 42 | ||
43 | *skb = ether_adjust_skb(*skb, ETH_HEADER_ETHERTAP); | 43 | len = net_recvfrom(fd, skb_mac_header(skb), |
44 | if (*skb == NULL) | 44 | skb->dev->mtu + 2 + ETH_HEADER_ETHERTAP); |
45 | return -ENOMEM; | ||
46 | len = net_recvfrom(fd, skb_mac_header(*skb), | ||
47 | (*skb)->dev->mtu + 2 * ETH_HEADER_ETHERTAP); | ||
48 | if (len <= 0) | 45 | if (len <= 0) |
49 | return len; | 46 | return(len); |
50 | skb_pull(*skb, 2); | 47 | |
48 | skb_pull(skb, 2); | ||
51 | len -= 2; | 49 | len -= 2; |
52 | return len; | 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) { | 55 | skb_push(skb, 2); |
58 | struct sk_buff *skb2; | 56 | return net_send(fd, skb->data, skb->len); |
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); | ||
68 | } | 57 | } |
69 | 58 | ||
70 | const struct net_kern_info ethertap_kern_info = { | 59 | const struct net_kern_info ethertap_kern_info = { |
@@ -99,6 +88,7 @@ static struct transport ethertap_transport = { | |||
99 | .user = ðertap_user_info, | 88 | .user = ðertap_user_info, |
100 | .kern = ðertap_kern_info, | 89 | .kern = ðertap_kern_info, |
101 | .private_size = sizeof(struct ethertap_data), | 90 | .private_size = sizeof(struct ethertap_data), |
91 | .setup_size = sizeof(struct ethertap_init), | ||
102 | }; | 92 | }; |
103 | 93 | ||
104 | static int register_ethertap(void) | 94 | static int register_ethertap(void) |
diff --git a/arch/um/os-Linux/drivers/ethertap_user.c b/arch/um/os-Linux/drivers/ethertap_user.c index 29404b955f18..4ff553603449 100644 --- a/arch/um/os-Linux/drivers/ethertap_user.c +++ b/arch/um/os-Linux/drivers/ethertap_user.c | |||
@@ -222,11 +222,6 @@ static void etap_close(int fd, void *data) | |||
222 | pri->control_fd = -1; | 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 | static void etap_add_addr(unsigned char *addr, unsigned char *netmask, | 225 | static void etap_add_addr(unsigned char *addr, unsigned char *netmask, |
231 | void *data) | 226 | void *data) |
232 | { | 227 | { |
@@ -254,8 +249,8 @@ const struct net_user_info ethertap_user_info = { | |||
254 | .open = etap_open, | 249 | .open = etap_open, |
255 | .close = etap_close, | 250 | .close = etap_close, |
256 | .remove = NULL, | 251 | .remove = NULL, |
257 | .set_mtu = etap_set_mtu, | ||
258 | .add_address = etap_add_addr, | 252 | .add_address = etap_add_addr, |
259 | .delete_address = etap_del_addr, | 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 | }; |
diff --git a/arch/um/os-Linux/drivers/tuntap_kern.c b/arch/um/os-Linux/drivers/tuntap_kern.c index 9ade1f892ac8..9d384807b077 100644 --- a/arch/um/os-Linux/drivers/tuntap_kern.c +++ b/arch/um/os-Linux/drivers/tuntap_kern.c | |||
@@ -35,20 +35,15 @@ static void tuntap_init(struct net_device *dev, void *data) | |||
35 | printk("\n"); | 35 | printk("\n"); |
36 | } | 36 | } |
37 | 37 | ||
38 | static int tuntap_read(int fd, struct sk_buff **skb, | 38 | static int tuntap_read(int fd, struct sk_buff *skb, struct uml_net_private *lp) |
39 | struct uml_net_private *lp) | ||
40 | { | 39 | { |
41 | *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER); | 40 | return net_read(fd, skb_mac_header(skb), |
42 | if (*skb == NULL) | 41 | skb->dev->mtu + ETH_HEADER_OTHER); |
43 | return -ENOMEM; | ||
44 | return net_read(fd, skb_mac_header(*skb), | ||
45 | (*skb)->dev->mtu + ETH_HEADER_OTHER); | ||
46 | } | 42 | } |
47 | 43 | ||
48 | static int tuntap_write(int fd, struct sk_buff **skb, | 44 | static int tuntap_write(int fd, struct sk_buff *skb, struct uml_net_private *lp) |
49 | 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 | const struct net_kern_info tuntap_kern_info = { | 49 | const struct net_kern_info tuntap_kern_info = { |
diff --git a/arch/um/os-Linux/drivers/tuntap_user.c b/arch/um/os-Linux/drivers/tuntap_user.c index 10714a413cfd..6c55d3c8ead8 100644 --- a/arch/um/os-Linux/drivers/tuntap_user.c +++ b/arch/um/os-Linux/drivers/tuntap_user.c | |||
@@ -18,8 +18,6 @@ | |||
18 | #include "tuntap.h" | 18 | #include "tuntap.h" |
19 | #include "user.h" | 19 | #include "user.h" |
20 | 20 | ||
21 | #define MAX_PACKET ETH_MAX_PACKET | ||
22 | |||
23 | static int tuntap_user_init(void *data, void *dev) | 21 | static int tuntap_user_init(void *data, void *dev) |
24 | { | 22 | { |
25 | struct tuntap_data *pri = data; | 23 | struct tuntap_data *pri = data; |
@@ -206,18 +204,13 @@ static void tuntap_close(int fd, void *data) | |||
206 | pri->fd = -1; | 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 | const struct net_user_info tuntap_user_info = { | 207 | const struct net_user_info tuntap_user_info = { |
215 | .init = tuntap_user_init, | 208 | .init = tuntap_user_init, |
216 | .open = tuntap_open, | 209 | .open = tuntap_open, |
217 | .close = tuntap_close, | 210 | .close = tuntap_close, |
218 | .remove = NULL, | 211 | .remove = NULL, |
219 | .set_mtu = tuntap_set_mtu, | ||
220 | .add_address = tuntap_add_addr, | 212 | .add_address = tuntap_add_addr, |
221 | .delete_address = tuntap_del_addr, | 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 | }; |