diff options
| -rw-r--r-- | arch/um/drivers/Makefile | 6 | ||||
| -rw-r--r-- | arch/um/drivers/slip.h | 23 | ||||
| -rw-r--r-- | arch/um/drivers/slip_common.c | 54 | ||||
| -rw-r--r-- | arch/um/drivers/slip_common.h (renamed from arch/um/drivers/slip_proto.h) | 44 | ||||
| -rw-r--r-- | arch/um/drivers/slip_kern.c | 12 | ||||
| -rw-r--r-- | arch/um/drivers/slip_user.c | 152 | ||||
| -rw-r--r-- | arch/um/drivers/slirp.h | 26 | ||||
| -rw-r--r-- | arch/um/drivers/slirp_kern.c | 5 | ||||
| -rw-r--r-- | arch/um/drivers/slirp_user.c | 104 |
9 files changed, 181 insertions, 245 deletions
diff --git a/arch/um/drivers/Makefile b/arch/um/drivers/Makefile index 323f72c64cd2..b2de9916c32c 100644 --- a/arch/um/drivers/Makefile +++ b/arch/um/drivers/Makefile | |||
| @@ -22,8 +22,8 @@ obj-y := stdio_console.o fd.o chan_kern.o chan_user.o line.o | |||
| 22 | obj-$(CONFIG_SSL) += ssl.o | 22 | obj-$(CONFIG_SSL) += ssl.o |
| 23 | obj-$(CONFIG_STDERR_CONSOLE) += stderr_console.o | 23 | obj-$(CONFIG_STDERR_CONSOLE) += stderr_console.o |
| 24 | 24 | ||
| 25 | obj-$(CONFIG_UML_NET_SLIP) += slip.o | 25 | obj-$(CONFIG_UML_NET_SLIP) += slip.o slip_common.o |
| 26 | obj-$(CONFIG_UML_NET_SLIRP) += slirp.o | 26 | obj-$(CONFIG_UML_NET_SLIRP) += slirp.o slip_common.o |
| 27 | obj-$(CONFIG_UML_NET_DAEMON) += daemon.o | 27 | obj-$(CONFIG_UML_NET_DAEMON) += daemon.o |
| 28 | obj-$(CONFIG_UML_NET_MCAST) += mcast.o | 28 | obj-$(CONFIG_UML_NET_MCAST) += mcast.o |
| 29 | #obj-$(CONFIG_UML_NET_PCAP) += pcap.o $(PCAP) | 29 | #obj-$(CONFIG_UML_NET_PCAP) += pcap.o $(PCAP) |
| @@ -41,6 +41,6 @@ obj-$(CONFIG_UML_WATCHDOG) += harddog.o | |||
| 41 | obj-$(CONFIG_BLK_DEV_COW_COMMON) += cow_user.o | 41 | obj-$(CONFIG_BLK_DEV_COW_COMMON) += cow_user.o |
| 42 | obj-$(CONFIG_UML_RANDOM) += random.o | 42 | obj-$(CONFIG_UML_RANDOM) += random.o |
| 43 | 43 | ||
| 44 | USER_OBJS := fd.o null.o pty.o tty.o xterm.o | 44 | USER_OBJS := fd.o null.o pty.o tty.o xterm.o slip_common.o |
| 45 | 45 | ||
| 46 | include arch/um/scripts/Makefile.rules | 46 | include arch/um/scripts/Makefile.rules |
diff --git a/arch/um/drivers/slip.h b/arch/um/drivers/slip.h index d523618cd5ac..bb0dab41c2e4 100644 --- a/arch/um/drivers/slip.h +++ b/arch/um/drivers/slip.h | |||
| @@ -1,10 +1,7 @@ | |||
| 1 | #ifndef __UM_SLIP_H | 1 | #ifndef __UM_SLIP_H |
| 2 | #define __UM_SLIP_H | 2 | #define __UM_SLIP_H |
| 3 | 3 | ||
| 4 | #define BUF_SIZE 1500 | 4 | #include "slip_common.h" |
| 5 | /* two bytes each for a (pathological) max packet of escaped chars + * | ||
| 6 | * terminating END char + initial END char */ | ||
| 7 | #define ENC_BUF_SIZE (2 * BUF_SIZE + 2) | ||
| 8 | 5 | ||
| 9 | struct slip_data { | 6 | struct slip_data { |
| 10 | void *dev; | 7 | void *dev; |
| @@ -12,28 +9,12 @@ struct slip_data { | |||
| 12 | char *addr; | 9 | char *addr; |
| 13 | char *gate_addr; | 10 | char *gate_addr; |
| 14 | int slave; | 11 | int slave; |
| 15 | unsigned char ibuf[ENC_BUF_SIZE]; | 12 | struct slip_proto slip; |
| 16 | unsigned char obuf[ENC_BUF_SIZE]; | ||
| 17 | int more; /* more data: do not read fd until ibuf has been drained */ | ||
| 18 | int pos; | ||
| 19 | int esc; | ||
| 20 | }; | 13 | }; |
| 21 | 14 | ||
| 22 | extern struct net_user_info slip_user_info; | 15 | extern struct net_user_info slip_user_info; |
| 23 | 16 | ||
| 24 | extern int set_umn_addr(int fd, char *addr, char *ptp_addr); | ||
| 25 | extern int slip_user_read(int fd, void *buf, int len, struct slip_data *pri); | 17 | extern int slip_user_read(int fd, void *buf, int len, struct slip_data *pri); |
| 26 | extern int slip_user_write(int fd, void *buf, int len, struct slip_data *pri); | 18 | extern int slip_user_write(int fd, void *buf, int len, struct slip_data *pri); |
| 27 | 19 | ||
| 28 | #endif | 20 | #endif |
| 29 | |||
| 30 | /* | ||
| 31 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
| 32 | * Emacs will notice this stuff at the end of the file and automatically | ||
| 33 | * adjust the settings for this buffer only. This must remain at the end | ||
| 34 | * of the file. | ||
| 35 | * --------------------------------------------------------------------------- | ||
| 36 | * Local variables: | ||
| 37 | * c-file-style: "linux" | ||
| 38 | * End: | ||
| 39 | */ | ||
diff --git a/arch/um/drivers/slip_common.c b/arch/um/drivers/slip_common.c new file mode 100644 index 000000000000..e89cfc68fc3e --- /dev/null +++ b/arch/um/drivers/slip_common.c | |||
| @@ -0,0 +1,54 @@ | |||
| 1 | #include <string.h> | ||
| 2 | #include "slip_common.h" | ||
| 3 | #include "net_user.h" | ||
| 4 | |||
| 5 | int slip_proto_read(int fd, void *buf, int len, struct slip_proto *slip) | ||
| 6 | { | ||
| 7 | int i, n, size, start; | ||
| 8 | |||
| 9 | if(slip->more > 0){ | ||
| 10 | i = 0; | ||
| 11 | while(i < slip->more){ | ||
| 12 | size = slip_unesc(slip->ibuf[i++], slip->ibuf, | ||
| 13 | &slip->pos, &slip->esc); | ||
| 14 | if(size){ | ||
| 15 | memcpy(buf, slip->ibuf, size); | ||
| 16 | memmove(slip->ibuf, &slip->ibuf[i], | ||
| 17 | slip->more - i); | ||
| 18 | slip->more = slip->more - i; | ||
| 19 | return size; | ||
| 20 | } | ||
| 21 | } | ||
| 22 | slip->more = 0; | ||
| 23 | } | ||
| 24 | |||
| 25 | n = net_read(fd, &slip->ibuf[slip->pos], | ||
| 26 | sizeof(slip->ibuf) - slip->pos); | ||
| 27 | if(n <= 0) | ||
| 28 | return n; | ||
| 29 | |||
| 30 | start = slip->pos; | ||
| 31 | for(i = 0; i < n; i++){ | ||
| 32 | size = slip_unesc(slip->ibuf[start + i], slip->ibuf,&slip->pos, | ||
| 33 | &slip->esc); | ||
| 34 | if(size){ | ||
| 35 | memcpy(buf, slip->ibuf, size); | ||
| 36 | memmove(slip->ibuf, &slip->ibuf[start+i+1], | ||
| 37 | n - (i + 1)); | ||
| 38 | slip->more = n - (i + 1); | ||
| 39 | return size; | ||
| 40 | } | ||
| 41 | } | ||
| 42 | return 0; | ||
| 43 | } | ||
| 44 | |||
| 45 | int slip_proto_write(int fd, void *buf, int len, struct slip_proto *slip) | ||
| 46 | { | ||
| 47 | int actual, n; | ||
| 48 | |||
| 49 | actual = slip_esc(buf, slip->obuf, len); | ||
| 50 | n = net_write(fd, slip->obuf, actual); | ||
| 51 | if(n < 0) | ||
| 52 | return n; | ||
| 53 | else return len; | ||
| 54 | } | ||
diff --git a/arch/um/drivers/slip_proto.h b/arch/um/drivers/slip_common.h index 4c4d94a33100..2ae76d8f1be1 100644 --- a/arch/um/drivers/slip_proto.h +++ b/arch/um/drivers/slip_common.h | |||
| @@ -1,10 +1,10 @@ | |||
| 1 | /* | 1 | #ifndef __UM_SLIP_COMMON_H |
| 2 | * Copyright (C) 2002 Jeff Dike (jdike@karaya.com) | 2 | #define __UM_SLIP_COMMON_H |
| 3 | * Licensed under the GPL | ||
| 4 | */ | ||
| 5 | 3 | ||
| 6 | #ifndef __UM_SLIP_PROTO_H__ | 4 | #define BUF_SIZE 1500 |
| 7 | #define __UM_SLIP_PROTO_H__ | 5 | /* two bytes each for a (pathological) max packet of escaped chars + * |
| 6 | * terminating END char + initial END char */ | ||
| 7 | #define ENC_BUF_SIZE (2 * BUF_SIZE + 2) | ||
| 8 | 8 | ||
| 9 | /* SLIP protocol characters. */ | 9 | /* SLIP protocol characters. */ |
| 10 | #define SLIP_END 0300 /* indicates end of frame */ | 10 | #define SLIP_END 0300 /* indicates end of frame */ |
| @@ -80,15 +80,25 @@ static inline int slip_esc(unsigned char *s, unsigned char *d, int len) | |||
| 80 | return (ptr - d); | 80 | return (ptr - d); |
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | #endif | 83 | struct slip_proto { |
| 84 | unsigned char ibuf[ENC_BUF_SIZE]; | ||
| 85 | unsigned char obuf[ENC_BUF_SIZE]; | ||
| 86 | int more; /* more data: do not read fd until ibuf has been drained */ | ||
| 87 | int pos; | ||
| 88 | int esc; | ||
| 89 | }; | ||
| 90 | |||
| 91 | #define SLIP_PROTO_INIT { \ | ||
| 92 | .ibuf = { '\0' }, \ | ||
| 93 | .obuf = { '\0' }, \ | ||
| 94 | .more = 0, \ | ||
| 95 | .pos = 0, \ | ||
| 96 | .esc = 0 \ | ||
| 97 | } | ||
| 84 | 98 | ||
| 85 | /* | 99 | extern int slip_proto_read(int fd, void *buf, int len, |
| 86 | * Overrides for Emacs so that we follow Linus's tabbing style. | 100 | struct slip_proto *slip); |
| 87 | * Emacs will notice this stuff at the end of the file and automatically | 101 | extern int slip_proto_write(int fd, void *buf, int len, |
| 88 | * adjust the settings for this buffer only. This must remain at the end | 102 | struct slip_proto *slip); |
| 89 | * of the file. | 103 | |
| 90 | * --------------------------------------------------------------------------- | 104 | #endif |
| 91 | * Local variables: | ||
| 92 | * c-file-style: "linux" | ||
| 93 | * End: | ||
| 94 | */ | ||
diff --git a/arch/um/drivers/slip_kern.c b/arch/um/drivers/slip_kern.c index 0886eedba213..9a6f5c85f902 100644 --- a/arch/um/drivers/slip_kern.c +++ b/arch/um/drivers/slip_kern.c | |||
| @@ -26,16 +26,16 @@ void slip_init(struct net_device *dev, void *data) | |||
| 26 | .addr = NULL, | 26 | .addr = NULL, |
| 27 | .gate_addr = init->gate_addr, | 27 | .gate_addr = init->gate_addr, |
| 28 | .slave = -1, | 28 | .slave = -1, |
| 29 | .ibuf = { '\0' }, | 29 | .slip = SLIP_PROTO_INIT, |
| 30 | .obuf = { '\0' }, | ||
| 31 | .pos = 0, | ||
| 32 | .esc = 0, | ||
| 33 | .dev = dev }); | 30 | .dev = dev }); |
| 34 | 31 | ||
| 35 | dev->init = NULL; | 32 | dev->init = NULL; |
| 33 | dev->header_cache_update = NULL; | ||
| 34 | dev->hard_header_cache = NULL; | ||
| 35 | dev->hard_header = NULL; | ||
| 36 | dev->hard_header_len = 0; | 36 | dev->hard_header_len = 0; |
| 37 | dev->addr_len = 4; | 37 | dev->addr_len = 0; |
| 38 | dev->type = ARPHRD_ETHER; | 38 | dev->type = ARPHRD_SLIP; |
| 39 | dev->tx_queue_len = 256; | 39 | dev->tx_queue_len = 256; |
| 40 | dev->flags = IFF_NOARP; | 40 | dev->flags = IFF_NOARP; |
| 41 | printk("SLIP backend - SLIP IP = %s\n", spri->gate_addr); | 41 | printk("SLIP backend - SLIP IP = %s\n", spri->gate_addr); |
diff --git a/arch/um/drivers/slip_user.c b/arch/um/drivers/slip_user.c index d94846b1b4cf..71af444e591f 100644 --- a/arch/um/drivers/slip_user.c +++ b/arch/um/drivers/slip_user.c | |||
| @@ -13,7 +13,7 @@ | |||
| 13 | #include "user.h" | 13 | #include "user.h" |
| 14 | #include "net_user.h" | 14 | #include "net_user.h" |
| 15 | #include "slip.h" | 15 | #include "slip.h" |
| 16 | #include "slip_proto.h" | 16 | #include "slip_common.h" |
| 17 | #include "helper.h" | 17 | #include "helper.h" |
| 18 | #include "os.h" | 18 | #include "os.h" |
| 19 | 19 | ||
| @@ -77,41 +77,51 @@ static int slip_tramp(char **argv, int fd) | |||
| 77 | err = os_pipe(fds, 1, 0); | 77 | err = os_pipe(fds, 1, 0); |
| 78 | if(err < 0){ | 78 | if(err < 0){ |
| 79 | printk("slip_tramp : pipe failed, err = %d\n", -err); | 79 | printk("slip_tramp : pipe failed, err = %d\n", -err); |
| 80 | return(err); | 80 | goto out; |
| 81 | } | 81 | } |
| 82 | 82 | ||
| 83 | err = 0; | 83 | err = 0; |
| 84 | pe_data.stdin = fd; | 84 | pe_data.stdin = fd; |
| 85 | pe_data.stdout = fds[1]; | 85 | pe_data.stdout = fds[1]; |
| 86 | pe_data.close_me = fds[0]; | 86 | pe_data.close_me = fds[0]; |
| 87 | pid = run_helper(slip_pre_exec, &pe_data, argv, NULL); | 87 | err = run_helper(slip_pre_exec, &pe_data, argv, NULL); |
| 88 | if(err < 0) | ||
| 89 | goto out_close; | ||
| 90 | pid = err; | ||
| 91 | |||
| 92 | output_len = page_size(); | ||
| 93 | output = um_kmalloc(output_len); | ||
| 94 | if(output == NULL){ | ||
| 95 | printk("slip_tramp : failed to allocate output buffer\n"); | ||
| 96 | os_kill_process(pid, 1); | ||
| 97 | err = -ENOMEM; | ||
| 98 | goto out_free; | ||
| 99 | } | ||
| 88 | 100 | ||
| 89 | if(pid < 0) err = pid; | 101 | os_close_file(fds[1]); |
| 90 | else { | 102 | read_output(fds[0], output, output_len); |
| 91 | output_len = page_size(); | 103 | printk("%s", output); |
| 92 | output = um_kmalloc(output_len); | 104 | |
| 93 | if(output == NULL) | 105 | CATCH_EINTR(err = waitpid(pid, &status, 0)); |
| 94 | printk("slip_tramp : failed to allocate output " | 106 | if(err < 0) |
| 95 | "buffer\n"); | 107 | err = errno; |
| 96 | 108 | else if(!WIFEXITED(status) || (WEXITSTATUS(status) != 0)){ | |
| 97 | os_close_file(fds[1]); | 109 | printk("'%s' didn't exit with status 0\n", argv[0]); |
| 98 | read_output(fds[0], output, output_len); | 110 | err = -EINVAL; |
| 99 | if(output != NULL){ | ||
| 100 | printk("%s", output); | ||
| 101 | kfree(output); | ||
| 102 | } | ||
| 103 | CATCH_EINTR(err = waitpid(pid, &status, 0)); | ||
| 104 | if(err < 0) | ||
| 105 | err = errno; | ||
| 106 | else if(!WIFEXITED(status) || (WEXITSTATUS(status) != 0)){ | ||
| 107 | printk("'%s' didn't exit with status 0\n", argv[0]); | ||
| 108 | err = -EINVAL; | ||
| 109 | } | ||
| 110 | } | 111 | } |
| 112 | else err = 0; | ||
| 111 | 113 | ||
| 112 | os_close_file(fds[0]); | 114 | os_close_file(fds[0]); |
| 113 | 115 | ||
| 114 | return(err); | 116 | out_free: |
| 117 | kfree(output); | ||
| 118 | return err; | ||
| 119 | |||
| 120 | out_close: | ||
| 121 | os_close_file(fds[0]); | ||
| 122 | os_close_file(fds[1]); | ||
| 123 | out: | ||
| 124 | return err; | ||
| 115 | } | 125 | } |
| 116 | 126 | ||
| 117 | static int slip_open(void *data) | 127 | static int slip_open(void *data) |
| @@ -123,21 +133,26 @@ static int slip_open(void *data) | |||
| 123 | NULL }; | 133 | NULL }; |
| 124 | int sfd, mfd, err; | 134 | int sfd, mfd, err; |
| 125 | 135 | ||
| 126 | mfd = get_pty(); | 136 | err = get_pty(); |
| 127 | if(mfd < 0){ | 137 | if(err < 0){ |
| 128 | printk("umn : Failed to open pty, err = %d\n", -mfd); | 138 | printk("slip-open : Failed to open pty, err = %d\n", -err); |
| 129 | return(mfd); | 139 | goto out; |
| 130 | } | 140 | } |
| 131 | sfd = os_open_file(ptsname(mfd), of_rdwr(OPENFLAGS()), 0); | 141 | mfd = err; |
| 132 | if(sfd < 0){ | 142 | |
| 133 | printk("Couldn't open tty for slip line, err = %d\n", -sfd); | 143 | err = os_open_file(ptsname(mfd), of_rdwr(OPENFLAGS()), 0); |
| 134 | os_close_file(mfd); | 144 | if(err < 0){ |
| 135 | return(sfd); | 145 | printk("Couldn't open tty for slip line, err = %d\n", -err); |
| 146 | goto out_close; | ||
| 136 | } | 147 | } |
| 137 | if(set_up_tty(sfd)) return(-1); | 148 | sfd = err; |
| 149 | |||
| 150 | if(set_up_tty(sfd)) | ||
| 151 | goto out_close2; | ||
| 152 | |||
| 138 | pri->slave = sfd; | 153 | pri->slave = sfd; |
| 139 | pri->pos = 0; | 154 | pri->slip.pos = 0; |
| 140 | pri->esc = 0; | 155 | pri->slip.esc = 0; |
| 141 | if(pri->gate_addr != NULL){ | 156 | if(pri->gate_addr != NULL){ |
| 142 | sprintf(version_buf, "%d", UML_NET_VERSION); | 157 | sprintf(version_buf, "%d", UML_NET_VERSION); |
| 143 | strcpy(gate_buf, pri->gate_addr); | 158 | strcpy(gate_buf, pri->gate_addr); |
| @@ -146,12 +161,12 @@ static int slip_open(void *data) | |||
| 146 | 161 | ||
| 147 | if(err < 0){ | 162 | if(err < 0){ |
| 148 | printk("slip_tramp failed - err = %d\n", -err); | 163 | printk("slip_tramp failed - err = %d\n", -err); |
| 149 | return(err); | 164 | goto out_close2; |
| 150 | } | 165 | } |
| 151 | err = os_get_ifname(pri->slave, pri->name); | 166 | err = os_get_ifname(pri->slave, pri->name); |
| 152 | if(err < 0){ | 167 | if(err < 0){ |
| 153 | printk("get_ifname failed, err = %d\n", -err); | 168 | printk("get_ifname failed, err = %d\n", -err); |
| 154 | return(err); | 169 | goto out_close2; |
| 155 | } | 170 | } |
| 156 | iter_addresses(pri->dev, open_addr, pri->name); | 171 | iter_addresses(pri->dev, open_addr, pri->name); |
| 157 | } | 172 | } |
| @@ -160,10 +175,16 @@ static int slip_open(void *data) | |||
| 160 | if(err < 0){ | 175 | if(err < 0){ |
| 161 | printk("Failed to set slip discipline encapsulation - " | 176 | printk("Failed to set slip discipline encapsulation - " |
| 162 | "err = %d\n", -err); | 177 | "err = %d\n", -err); |
| 163 | return(err); | 178 | goto out_close2; |
| 164 | } | 179 | } |
| 165 | } | 180 | } |
| 166 | return(mfd); | 181 | return(mfd); |
| 182 | out_close2: | ||
| 183 | os_close_file(sfd); | ||
| 184 | out_close: | ||
| 185 | os_close_file(mfd); | ||
| 186 | out: | ||
| 187 | return err; | ||
| 167 | } | 188 | } |
| 168 | 189 | ||
| 169 | static void slip_close(int fd, void *data) | 190 | static void slip_close(int fd, void *data) |
| @@ -190,48 +211,12 @@ static void slip_close(int fd, void *data) | |||
| 190 | 211 | ||
| 191 | int slip_user_read(int fd, void *buf, int len, struct slip_data *pri) | 212 | int slip_user_read(int fd, void *buf, int len, struct slip_data *pri) |
| 192 | { | 213 | { |
| 193 | int i, n, size, start; | 214 | return slip_proto_read(fd, buf, len, &pri->slip); |
| 194 | |||
| 195 | if(pri->more>0) { | ||
| 196 | i = 0; | ||
| 197 | while(i < pri->more) { | ||
| 198 | size = slip_unesc(pri->ibuf[i++], | ||
| 199 | pri->ibuf, &pri->pos, &pri->esc); | ||
| 200 | if(size){ | ||
| 201 | memcpy(buf, pri->ibuf, size); | ||
| 202 | memmove(pri->ibuf, &pri->ibuf[i], pri->more-i); | ||
| 203 | pri->more=pri->more-i; | ||
| 204 | return(size); | ||
| 205 | } | ||
| 206 | } | ||
| 207 | pri->more=0; | ||
| 208 | } | ||
| 209 | |||
| 210 | n = net_read(fd, &pri->ibuf[pri->pos], sizeof(pri->ibuf) - pri->pos); | ||
| 211 | if(n <= 0) return(n); | ||
| 212 | |||
| 213 | start = pri->pos; | ||
| 214 | for(i = 0; i < n; i++){ | ||
| 215 | size = slip_unesc(pri->ibuf[start + i], | ||
| 216 | pri->ibuf, &pri->pos, &pri->esc); | ||
| 217 | if(size){ | ||
| 218 | memcpy(buf, pri->ibuf, size); | ||
| 219 | memmove(pri->ibuf, &pri->ibuf[start+i+1], n-(i+1)); | ||
| 220 | pri->more=n-(i+1); | ||
| 221 | return(size); | ||
| 222 | } | ||
| 223 | } | ||
| 224 | return(0); | ||
| 225 | } | 215 | } |
| 226 | 216 | ||
| 227 | int slip_user_write(int fd, void *buf, int len, struct slip_data *pri) | 217 | int slip_user_write(int fd, void *buf, int len, struct slip_data *pri) |
| 228 | { | 218 | { |
| 229 | int actual, n; | 219 | return slip_proto_write(fd, buf, len, &pri->slip); |
| 230 | |||
| 231 | actual = slip_esc(buf, pri->obuf, len); | ||
| 232 | n = net_write(fd, pri->obuf, actual); | ||
| 233 | if(n < 0) return(n); | ||
| 234 | else return(len); | ||
| 235 | } | 220 | } |
| 236 | 221 | ||
| 237 | static int slip_set_mtu(int mtu, void *data) | 222 | static int slip_set_mtu(int mtu, void *data) |
| @@ -267,14 +252,3 @@ struct net_user_info slip_user_info = { | |||
| 267 | .delete_address = slip_del_addr, | 252 | .delete_address = slip_del_addr, |
| 268 | .max_packet = BUF_SIZE | 253 | .max_packet = BUF_SIZE |
| 269 | }; | 254 | }; |
| 270 | |||
| 271 | /* | ||
| 272 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
| 273 | * Emacs will notice this stuff at the end of the file and automatically | ||
| 274 | * adjust the settings for this buffer only. This must remain at the end | ||
| 275 | * of the file. | ||
| 276 | * --------------------------------------------------------------------------- | ||
| 277 | * Local variables: | ||
| 278 | * c-file-style: "linux" | ||
| 279 | * End: | ||
| 280 | */ | ||
diff --git a/arch/um/drivers/slirp.h b/arch/um/drivers/slirp.h index afa4e30284fd..6cf88ab580c9 100644 --- a/arch/um/drivers/slirp.h +++ b/arch/um/drivers/slirp.h | |||
| @@ -1,10 +1,7 @@ | |||
| 1 | #ifndef __UM_SLIRP_H | 1 | #ifndef __UM_SLIRP_H |
| 2 | #define __UM_SLIRP_H | 2 | #define __UM_SLIRP_H |
| 3 | 3 | ||
| 4 | #define BUF_SIZE 1500 | 4 | #include "slip_common.h" |
| 5 | /* two bytes each for a (pathological) max packet of escaped chars + * | ||
| 6 | * terminating END char + initial END char */ | ||
| 7 | #define ENC_BUF_SIZE (2 * BUF_SIZE + 2) | ||
| 8 | 5 | ||
| 9 | #define SLIRP_MAX_ARGS 100 | 6 | #define SLIRP_MAX_ARGS 100 |
| 10 | /* | 7 | /* |
| @@ -24,28 +21,13 @@ struct slirp_data { | |||
| 24 | struct arg_list_dummy_wrapper argw; | 21 | struct arg_list_dummy_wrapper argw; |
| 25 | int pid; | 22 | int pid; |
| 26 | int slave; | 23 | int slave; |
| 27 | unsigned char ibuf[ENC_BUF_SIZE]; | 24 | struct slip_proto slip; |
| 28 | unsigned char obuf[ENC_BUF_SIZE]; | ||
| 29 | int more; /* more data: do not read fd until ibuf has been drained */ | ||
| 30 | int pos; | ||
| 31 | int esc; | ||
| 32 | }; | 25 | }; |
| 33 | 26 | ||
| 34 | extern struct net_user_info slirp_user_info; | 27 | extern struct net_user_info slirp_user_info; |
| 35 | 28 | ||
| 36 | extern int set_umn_addr(int fd, char *addr, char *ptp_addr); | ||
| 37 | extern int slirp_user_read(int fd, void *buf, int len, struct slirp_data *pri); | 29 | extern int slirp_user_read(int fd, void *buf, int len, struct slirp_data *pri); |
| 38 | extern int slirp_user_write(int fd, void *buf, int len, struct slirp_data *pri); | 30 | extern int slirp_user_write(int fd, void *buf, int len, |
| 31 | struct slirp_data *pri); | ||
| 39 | 32 | ||
| 40 | #endif | 33 | #endif |
| 41 | |||
| 42 | /* | ||
| 43 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
| 44 | * Emacs will notice this stuff at the end of the file and automatically | ||
| 45 | * adjust the settings for this buffer only. This must remain at the end | ||
| 46 | * of the file. | ||
| 47 | * --------------------------------------------------------------------------- | ||
| 48 | * Local variables: | ||
| 49 | * c-file-style: "linux" | ||
| 50 | * End: | ||
| 51 | */ | ||
diff --git a/arch/um/drivers/slirp_kern.c b/arch/um/drivers/slirp_kern.c index c9d6b52a831d..9864d27afdbe 100644 --- a/arch/um/drivers/slirp_kern.c +++ b/arch/um/drivers/slirp_kern.c | |||
| @@ -25,10 +25,7 @@ void slirp_init(struct net_device *dev, void *data) | |||
| 25 | { .argw = init->argw, | 25 | { .argw = init->argw, |
| 26 | .pid = -1, | 26 | .pid = -1, |
| 27 | .slave = -1, | 27 | .slave = -1, |
| 28 | .ibuf = { '\0' }, | 28 | .slip = SLIP_PROTO_INIT, |
| 29 | .obuf = { '\0' }, | ||
| 30 | .pos = 0, | ||
| 31 | .esc = 0, | ||
| 32 | .dev = dev }); | 29 | .dev = dev }); |
| 33 | 30 | ||
| 34 | dev->init = NULL; | 31 | dev->init = NULL; |
diff --git a/arch/um/drivers/slirp_user.c b/arch/um/drivers/slirp_user.c index c322515c71cc..8d91f663d82c 100644 --- a/arch/um/drivers/slirp_user.c +++ b/arch/um/drivers/slirp_user.c | |||
| @@ -12,7 +12,7 @@ | |||
| 12 | #include "user.h" | 12 | #include "user.h" |
| 13 | #include "net_user.h" | 13 | #include "net_user.h" |
| 14 | #include "slirp.h" | 14 | #include "slirp.h" |
| 15 | #include "slip_proto.h" | 15 | #include "slip_common.h" |
| 16 | #include "helper.h" | 16 | #include "helper.h" |
| 17 | #include "os.h" | 17 | #include "os.h" |
| 18 | 18 | ||
| @@ -48,47 +48,32 @@ static int slirp_tramp(char **argv, int fd) | |||
| 48 | return(pid); | 48 | return(pid); |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | /* XXX This is just a trivial wrapper around os_pipe */ | ||
| 52 | static int slirp_datachan(int *mfd, int *sfd) | ||
| 53 | { | ||
| 54 | int fds[2], err; | ||
| 55 | |||
| 56 | err = os_pipe(fds, 1, 1); | ||
| 57 | if(err < 0){ | ||
| 58 | printk("slirp_datachan: Failed to open pipe, err = %d\n", -err); | ||
| 59 | return(err); | ||
| 60 | } | ||
| 61 | |||
| 62 | *mfd = fds[0]; | ||
| 63 | *sfd = fds[1]; | ||
| 64 | return(0); | ||
| 65 | } | ||
| 66 | |||
| 67 | static int slirp_open(void *data) | 51 | static int slirp_open(void *data) |
| 68 | { | 52 | { |
| 69 | struct slirp_data *pri = data; | 53 | struct slirp_data *pri = data; |
| 70 | int sfd, mfd, pid, err; | 54 | int fds[2], pid, err; |
| 71 | 55 | ||
| 72 | err = slirp_datachan(&mfd, &sfd); | 56 | err = os_pipe(fds, 1, 1); |
| 73 | if(err) | 57 | if(err) |
| 74 | return(err); | 58 | return(err); |
| 75 | 59 | ||
| 76 | pid = slirp_tramp(pri->argw.argv, sfd); | 60 | err = slirp_tramp(pri->argw.argv, fds[1]); |
| 77 | 61 | if(err < 0){ | |
| 78 | if(pid < 0){ | 62 | printk("slirp_tramp failed - errno = %d\n", -err); |
| 79 | printk("slirp_tramp failed - errno = %d\n", -pid); | 63 | goto out; |
| 80 | os_close_file(sfd); | ||
| 81 | os_close_file(mfd); | ||
| 82 | return(pid); | ||
| 83 | } | 64 | } |
| 84 | 65 | pid = err; | |
| 85 | pri->slave = sfd; | 66 | |
| 86 | pri->pos = 0; | 67 | pri->slave = fds[1]; |
| 87 | pri->esc = 0; | 68 | pri->slip.pos = 0; |
| 88 | 69 | pri->slip.esc = 0; | |
| 89 | pri->pid = pid; | 70 | pri->pid = err; |
| 90 | 71 | ||
| 91 | return(mfd); | 72 | return(fds[0]); |
| 73 | out: | ||
| 74 | os_close_file(fds[0]); | ||
| 75 | os_close_file(fds[1]); | ||
| 76 | return err; | ||
| 92 | } | 77 | } |
| 93 | 78 | ||
| 94 | static void slirp_close(int fd, void *data) | 79 | static void slirp_close(int fd, void *data) |
| @@ -129,48 +114,12 @@ static void slirp_close(int fd, void *data) | |||
| 129 | 114 | ||
| 130 | int slirp_user_read(int fd, void *buf, int len, struct slirp_data *pri) | 115 | int slirp_user_read(int fd, void *buf, int len, struct slirp_data *pri) |
| 131 | { | 116 | { |
| 132 | int i, n, size, start; | 117 | return slip_proto_read(fd, buf, len, &pri->slip); |
| 133 | |||
| 134 | if(pri->more>0) { | ||
| 135 | i = 0; | ||
| 136 | while(i < pri->more) { | ||
| 137 | size = slip_unesc(pri->ibuf[i++], | ||
| 138 | pri->ibuf,&pri->pos,&pri->esc); | ||
| 139 | if(size){ | ||
| 140 | memcpy(buf, pri->ibuf, size); | ||
| 141 | memmove(pri->ibuf, &pri->ibuf[i], pri->more-i); | ||
| 142 | pri->more=pri->more-i; | ||
| 143 | return(size); | ||
| 144 | } | ||
| 145 | } | ||
| 146 | pri->more=0; | ||
| 147 | } | ||
| 148 | |||
| 149 | n = net_read(fd, &pri->ibuf[pri->pos], sizeof(pri->ibuf) - pri->pos); | ||
| 150 | if(n <= 0) return(n); | ||
| 151 | |||
| 152 | start = pri->pos; | ||
| 153 | for(i = 0; i < n; i++){ | ||
| 154 | size = slip_unesc(pri->ibuf[start + i], | ||
| 155 | pri->ibuf,&pri->pos,&pri->esc); | ||
| 156 | if(size){ | ||
| 157 | memcpy(buf, pri->ibuf, size); | ||
| 158 | memmove(pri->ibuf, &pri->ibuf[start+i+1], n-(i+1)); | ||
| 159 | pri->more=n-(i+1); | ||
| 160 | return(size); | ||
| 161 | } | ||
| 162 | } | ||
| 163 | return(0); | ||
| 164 | } | 118 | } |
| 165 | 119 | ||
| 166 | int slirp_user_write(int fd, void *buf, int len, struct slirp_data *pri) | 120 | int slirp_user_write(int fd, void *buf, int len, struct slirp_data *pri) |
| 167 | { | 121 | { |
| 168 | int actual, n; | 122 | return slip_proto_write(fd, buf, len, &pri->slip); |
| 169 | |||
| 170 | actual = slip_esc(buf, pri->obuf, len); | ||
| 171 | n = net_write(fd, pri->obuf, actual); | ||
| 172 | if(n < 0) return(n); | ||
| 173 | else return(len); | ||
| 174 | } | 123 | } |
| 175 | 124 | ||
| 176 | static int slirp_set_mtu(int mtu, void *data) | 125 | static int slirp_set_mtu(int mtu, void *data) |
| @@ -188,14 +137,3 @@ struct net_user_info slirp_user_info = { | |||
| 188 | .delete_address = NULL, | 137 | .delete_address = NULL, |
| 189 | .max_packet = BUF_SIZE | 138 | .max_packet = BUF_SIZE |
| 190 | }; | 139 | }; |
| 191 | |||
| 192 | /* | ||
| 193 | * Overrides for Emacs so that we follow Linus's tabbing style. | ||
| 194 | * Emacs will notice this stuff at the end of the file and automatically | ||
| 195 | * adjust the settings for this buffer only. This must remain at the end | ||
| 196 | * of the file. | ||
| 197 | * --------------------------------------------------------------------------- | ||
| 198 | * Local variables: | ||
| 199 | * c-file-style: "linux" | ||
| 200 | * End: | ||
| 201 | */ | ||
