toplevel: remove error handling from qemu_malloc() callers (Avi Kivity)
[qemu] / net.c
1 /*
2  * QEMU System Emulator
3  *
4  * Copyright (c) 2003-2008 Fabrice Bellard
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 #include "qemu-common.h"
25 #include "net.h"
26 #include "console.h"
27 #include "sysemu.h"
28 #include "qemu-timer.h"
29 #include "qemu-char.h"
30 #include "audio/audio.h"
31
32 #include <unistd.h>
33 #include <fcntl.h>
34 #include <signal.h>
35 #include <time.h>
36 #include <errno.h>
37 #include <sys/time.h>
38 #include <zlib.h>
39
40 #ifndef _WIN32
41 #include <sys/times.h>
42 #include <sys/wait.h>
43 #include <termios.h>
44 #include <sys/mman.h>
45 #include <sys/ioctl.h>
46 #include <sys/resource.h>
47 #include <sys/socket.h>
48 #include <netinet/in.h>
49 #include <net/if.h>
50 #ifdef __NetBSD__
51 #include <net/if_tap.h>
52 #endif
53 #ifdef __linux__
54 #include <linux/if_tun.h>
55 #endif
56 #include <arpa/inet.h>
57 #include <dirent.h>
58 #include <netdb.h>
59 #include <sys/select.h>
60 #ifdef _BSD
61 #include <sys/stat.h>
62 #ifdef __FreeBSD__
63 #include <libutil.h>
64 #else
65 #include <util.h>
66 #endif
67 #elif defined (__GLIBC__) && defined (__FreeBSD_kernel__)
68 #include <freebsd/stdlib.h>
69 #else
70 #ifdef __linux__
71 #include <pty.h>
72 #include <malloc.h>
73 #include <linux/rtc.h>
74
75 /* For the benefit of older linux systems which don't supply it,
76    we use a local copy of hpet.h. */
77 /* #include <linux/hpet.h> */
78 #include "hpet.h"
79
80 #include <linux/ppdev.h>
81 #include <linux/parport.h>
82 #endif
83 #ifdef __sun__
84 #include <sys/stat.h>
85 #include <sys/ethernet.h>
86 #include <sys/sockio.h>
87 #include <netinet/arp.h>
88 #include <netinet/in.h>
89 #include <netinet/in_systm.h>
90 #include <netinet/ip.h>
91 #include <netinet/ip_icmp.h> // must come after ip.h
92 #include <netinet/udp.h>
93 #include <netinet/tcp.h>
94 #include <net/if.h>
95 #include <syslog.h>
96 #include <stropts.h>
97 #endif
98 #endif
99 #endif
100
101 #include "qemu_socket.h"
102
103 #if defined(CONFIG_SLIRP)
104 #include "libslirp.h"
105 #endif
106
107 #if defined(__OpenBSD__)
108 #include <util.h>
109 #endif
110
111 #if defined(CONFIG_VDE)
112 #include <libvdeplug.h>
113 #endif
114
115 #ifdef _WIN32
116 #include <malloc.h>
117 #include <sys/timeb.h>
118 #include <mmsystem.h>
119 #define getopt_long_only getopt_long
120 #define memalign(align, size) malloc(size)
121 #endif
122
123 static VLANState *first_vlan;
124
125 /***********************************************************/
126 /* network device redirectors */
127
128 #if defined(DEBUG_NET) || defined(DEBUG_SLIRP)
129 static void hex_dump(FILE *f, const uint8_t *buf, int size)
130 {
131     int len, i, j, c;
132
133     for(i=0;i<size;i+=16) {
134         len = size - i;
135         if (len > 16)
136             len = 16;
137         fprintf(f, "%08x ", i);
138         for(j=0;j<16;j++) {
139             if (j < len)
140                 fprintf(f, " %02x", buf[i+j]);
141             else
142                 fprintf(f, "   ");
143         }
144         fprintf(f, " ");
145         for(j=0;j<len;j++) {
146             c = buf[i+j];
147             if (c < ' ' || c > '~')
148                 c = '.';
149             fprintf(f, "%c", c);
150         }
151         fprintf(f, "\n");
152     }
153 }
154 #endif
155
156 static int parse_macaddr(uint8_t *macaddr, const char *p)
157 {
158     int i;
159     char *last_char;
160     long int offset;
161
162     errno = 0;
163     offset = strtol(p, &last_char, 0);    
164     if (0 == errno && '\0' == *last_char &&
165             offset >= 0 && offset <= 0xFFFFFF) {
166         macaddr[3] = (offset & 0xFF0000) >> 16;
167         macaddr[4] = (offset & 0xFF00) >> 8;
168         macaddr[5] = offset & 0xFF;
169         return 0;
170     } else {
171         for(i = 0; i < 6; i++) {
172             macaddr[i] = strtol(p, (char **)&p, 16);
173             if (i == 5) {
174                 if (*p != '\0')
175                     return -1;
176             } else {
177                 if (*p != ':' && *p != '-')
178                     return -1;
179                 p++;
180             }
181         }
182         return 0;    
183     }
184
185     return -1;
186 }
187
188 static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
189 {
190     const char *p, *p1;
191     int len;
192     p = *pp;
193     p1 = strchr(p, sep);
194     if (!p1)
195         return -1;
196     len = p1 - p;
197     p1++;
198     if (buf_size > 0) {
199         if (len > buf_size - 1)
200             len = buf_size - 1;
201         memcpy(buf, p, len);
202         buf[len] = '\0';
203     }
204     *pp = p1;
205     return 0;
206 }
207
208 int parse_host_src_port(struct sockaddr_in *haddr,
209                         struct sockaddr_in *saddr,
210                         const char *input_str)
211 {
212     char *str = strdup(input_str);
213     char *host_str = str;
214     char *src_str;
215     const char *src_str2;
216     char *ptr;
217
218     /*
219      * Chop off any extra arguments at the end of the string which
220      * would start with a comma, then fill in the src port information
221      * if it was provided else use the "any address" and "any port".
222      */
223     if ((ptr = strchr(str,',')))
224         *ptr = '\0';
225
226     if ((src_str = strchr(input_str,'@'))) {
227         *src_str = '\0';
228         src_str++;
229     }
230
231     if (parse_host_port(haddr, host_str) < 0)
232         goto fail;
233
234     src_str2 = src_str;
235     if (!src_str || *src_str == '\0')
236         src_str2 = ":0";
237
238     if (parse_host_port(saddr, src_str2) < 0)
239         goto fail;
240
241     free(str);
242     return(0);
243
244 fail:
245     free(str);
246     return -1;
247 }
248
249 int parse_host_port(struct sockaddr_in *saddr, const char *str)
250 {
251     char buf[512];
252     struct hostent *he;
253     const char *p, *r;
254     int port;
255
256     p = str;
257     if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
258         return -1;
259     saddr->sin_family = AF_INET;
260     if (buf[0] == '\0') {
261         saddr->sin_addr.s_addr = 0;
262     } else {
263         if (qemu_isdigit(buf[0])) {
264             if (!inet_aton(buf, &saddr->sin_addr))
265                 return -1;
266         } else {
267             if ((he = gethostbyname(buf)) == NULL)
268                 return - 1;
269             saddr->sin_addr = *(struct in_addr *)he->h_addr;
270         }
271     }
272     port = strtol(p, (char **)&r, 0);
273     if (r == p)
274         return -1;
275     saddr->sin_port = htons(port);
276     return 0;
277 }
278
279 #if !defined(_WIN32) && 0
280 static int parse_unix_path(struct sockaddr_un *uaddr, const char *str)
281 {
282     const char *p;
283     int len;
284
285     len = MIN(108, strlen(str));
286     p = strchr(str, ',');
287     if (p)
288         len = MIN(len, p - str);
289
290     memset(uaddr, 0, sizeof(*uaddr));
291
292     uaddr->sun_family = AF_UNIX;
293     memcpy(uaddr->sun_path, str, len);
294
295     return 0;
296 }
297 #endif
298
299 void qemu_format_nic_info_str(VLANClientState *vc, uint8_t macaddr[6])
300 {
301     snprintf(vc->info_str, sizeof(vc->info_str),
302              "model=%s,macaddr=%02x:%02x:%02x:%02x:%02x:%02x",
303              vc->model,
304              macaddr[0], macaddr[1], macaddr[2],
305              macaddr[3], macaddr[4], macaddr[5]);
306 }
307
308 static char *assign_name(VLANClientState *vc1, const char *model)
309 {
310     VLANState *vlan;
311     char buf[256];
312     int id = 0;
313
314     for (vlan = first_vlan; vlan; vlan = vlan->next) {
315         VLANClientState *vc;
316
317         for (vc = vlan->first_client; vc; vc = vc->next)
318             if (vc != vc1 && strcmp(vc->model, model) == 0)
319                 id++;
320     }
321
322     snprintf(buf, sizeof(buf), "%s.%d", model, id);
323
324     return strdup(buf);
325 }
326
327 VLANClientState *qemu_new_vlan_client(VLANState *vlan,
328                                       const char *model,
329                                       const char *name,
330                                       IOReadHandler *fd_read,
331                                       IOCanRWHandler *fd_can_read,
332                                       void *opaque)
333 {
334     VLANClientState *vc, **pvc;
335     vc = qemu_mallocz(sizeof(VLANClientState));
336     vc->model = strdup(model);
337     if (name)
338         vc->name = strdup(name);
339     else
340         vc->name = assign_name(vc, model);
341     vc->fd_read = fd_read;
342     vc->fd_can_read = fd_can_read;
343     vc->opaque = opaque;
344     vc->vlan = vlan;
345
346     vc->next = NULL;
347     pvc = &vlan->first_client;
348     while (*pvc != NULL)
349         pvc = &(*pvc)->next;
350     *pvc = vc;
351     return vc;
352 }
353
354 void qemu_del_vlan_client(VLANClientState *vc)
355 {
356     VLANClientState **pvc = &vc->vlan->first_client;
357
358     while (*pvc != NULL)
359         if (*pvc == vc) {
360             *pvc = vc->next;
361             free(vc->name);
362             free(vc->model);
363             free(vc);
364             break;
365         } else
366             pvc = &(*pvc)->next;
367 }
368
369 int qemu_can_send_packet(VLANClientState *vc1)
370 {
371     VLANState *vlan = vc1->vlan;
372     VLANClientState *vc;
373
374     for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
375         if (vc != vc1) {
376             if (vc->fd_can_read && vc->fd_can_read(vc->opaque))
377                 return 1;
378         }
379     }
380     return 0;
381 }
382
383 void qemu_send_packet(VLANClientState *vc1, const uint8_t *buf, int size)
384 {
385     VLANState *vlan = vc1->vlan;
386     VLANClientState *vc;
387
388     if (vc1->link_down)
389         return;
390
391 #ifdef DEBUG_NET
392     printf("vlan %d send:\n", vlan->id);
393     hex_dump(stdout, buf, size);
394 #endif
395     for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
396         if (vc != vc1 && !vc->link_down) {
397             vc->fd_read(vc->opaque, buf, size);
398         }
399     }
400 }
401
402 static ssize_t vc_sendv_compat(VLANClientState *vc, const struct iovec *iov,
403                                int iovcnt)
404 {
405     uint8_t buffer[4096];
406     size_t offset = 0;
407     int i;
408
409     for (i = 0; i < iovcnt; i++) {
410         size_t len;
411
412         len = MIN(sizeof(buffer) - offset, iov[i].iov_len);
413         memcpy(buffer + offset, iov[i].iov_base, len);
414         offset += len;
415     }
416
417     vc->fd_read(vc->opaque, buffer, offset);
418
419     return offset;
420 }
421
422 static ssize_t calc_iov_length(const struct iovec *iov, int iovcnt)
423 {
424     size_t offset = 0;
425     int i;
426
427     for (i = 0; i < iovcnt; i++)
428         offset += iov[i].iov_len;
429     return offset;
430 }
431
432 ssize_t qemu_sendv_packet(VLANClientState *vc1, const struct iovec *iov,
433                           int iovcnt)
434 {
435     VLANState *vlan = vc1->vlan;
436     VLANClientState *vc;
437     ssize_t max_len = 0;
438
439     if (vc1->link_down)
440         return calc_iov_length(iov, iovcnt);
441
442     for (vc = vlan->first_client; vc != NULL; vc = vc->next) {
443         ssize_t len = 0;
444
445         if (vc == vc1)
446             continue;
447
448         if (vc->link_down)
449             len = calc_iov_length(iov, iovcnt);
450         if (vc->fd_readv)
451             len = vc->fd_readv(vc->opaque, iov, iovcnt);
452         else if (vc->fd_read)
453             len = vc_sendv_compat(vc, iov, iovcnt);
454
455         max_len = MAX(max_len, len);
456     }
457
458     return max_len;
459 }
460
461 #if defined(CONFIG_SLIRP)
462
463 /* slirp network adapter */
464
465 static int slirp_inited;
466 static int slirp_restrict;
467 static char *slirp_ip;
468 static VLANClientState *slirp_vc;
469
470 int slirp_can_output(void)
471 {
472     return !slirp_vc || qemu_can_send_packet(slirp_vc);
473 }
474
475 void slirp_output(const uint8_t *pkt, int pkt_len)
476 {
477 #ifdef DEBUG_SLIRP
478     printf("slirp output:\n");
479     hex_dump(stdout, pkt, pkt_len);
480 #endif
481     if (!slirp_vc)
482         return;
483     qemu_send_packet(slirp_vc, pkt, pkt_len);
484 }
485
486 int slirp_is_inited(void)
487 {
488     return slirp_inited;
489 }
490
491 static void slirp_receive(void *opaque, const uint8_t *buf, int size)
492 {
493 #ifdef DEBUG_SLIRP
494     printf("slirp input:\n");
495     hex_dump(stdout, buf, size);
496 #endif
497     slirp_input(buf, size);
498 }
499
500 static int net_slirp_init(VLANState *vlan, const char *model, const char *name)
501 {
502     if (!slirp_inited) {
503         slirp_inited = 1;
504         slirp_init(slirp_restrict, slirp_ip);
505     }
506     slirp_vc = qemu_new_vlan_client(vlan, model, name,
507                                     slirp_receive, NULL, NULL);
508     slirp_vc->info_str[0] = '\0';
509     return 0;
510 }
511
512 void net_slirp_redir(const char *redir_str)
513 {
514     int is_udp;
515     char buf[256], *r;
516     const char *p;
517     struct in_addr guest_addr;
518     int host_port, guest_port;
519
520     if (!slirp_inited) {
521         slirp_inited = 1;
522         slirp_init(slirp_restrict, slirp_ip);
523     }
524
525     p = redir_str;
526     if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
527         goto fail;
528     if (!strcmp(buf, "tcp")) {
529         is_udp = 0;
530     } else if (!strcmp(buf, "udp")) {
531         is_udp = 1;
532     } else {
533         goto fail;
534     }
535
536     if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
537         goto fail;
538     host_port = strtol(buf, &r, 0);
539     if (r == buf)
540         goto fail;
541
542     if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
543         goto fail;
544     if (buf[0] == '\0') {
545         pstrcpy(buf, sizeof(buf), "10.0.2.15");
546     }
547     if (!inet_aton(buf, &guest_addr))
548         goto fail;
549
550     guest_port = strtol(p, &r, 0);
551     if (r == p)
552         goto fail;
553
554     if (slirp_redir(is_udp, host_port, guest_addr, guest_port) < 0) {
555         fprintf(stderr, "qemu: could not set up redirection\n");
556         exit(1);
557     }
558     return;
559  fail:
560     fprintf(stderr, "qemu: syntax: -redir [tcp|udp]:host-port:[guest-host]:guest-port\n");
561     exit(1);
562 }
563
564 #ifndef _WIN32
565
566 static char smb_dir[1024];
567
568 static void erase_dir(char *dir_name)
569 {
570     DIR *d;
571     struct dirent *de;
572     char filename[1024];
573
574     /* erase all the files in the directory */
575     if ((d = opendir(dir_name)) != 0) {
576         for(;;) {
577             de = readdir(d);
578             if (!de)
579                 break;
580             if (strcmp(de->d_name, ".") != 0 &&
581                 strcmp(de->d_name, "..") != 0) {
582                 snprintf(filename, sizeof(filename), "%s/%s",
583                          smb_dir, de->d_name);
584                 if (unlink(filename) != 0)  /* is it a directory? */
585                     erase_dir(filename);
586             }
587         }
588         closedir(d);
589         rmdir(dir_name);
590     }
591 }
592
593 /* automatic user mode samba server configuration */
594 static void smb_exit(void)
595 {
596     erase_dir(smb_dir);
597 }
598
599 /* automatic user mode samba server configuration */
600 void net_slirp_smb(const char *exported_dir)
601 {
602     char smb_conf[1024];
603     char smb_cmdline[1024];
604     FILE *f;
605
606     if (!slirp_inited) {
607         slirp_inited = 1;
608         slirp_init(slirp_restrict, slirp_ip);
609     }
610
611     /* XXX: better tmp dir construction */
612     snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%d", getpid());
613     if (mkdir(smb_dir, 0700) < 0) {
614         fprintf(stderr, "qemu: could not create samba server dir '%s'\n", smb_dir);
615         exit(1);
616     }
617     snprintf(smb_conf, sizeof(smb_conf), "%s/%s", smb_dir, "smb.conf");
618
619     f = fopen(smb_conf, "w");
620     if (!f) {
621         fprintf(stderr, "qemu: could not create samba server configuration file '%s'\n", smb_conf);
622         exit(1);
623     }
624     fprintf(f,
625             "[global]\n"
626             "private dir=%s\n"
627             "smb ports=0\n"
628             "socket address=127.0.0.1\n"
629             "pid directory=%s\n"
630             "lock directory=%s\n"
631             "log file=%s/log.smbd\n"
632             "smb passwd file=%s/smbpasswd\n"
633             "security = share\n"
634             "[qemu]\n"
635             "path=%s\n"
636             "read only=no\n"
637             "guest ok=yes\n",
638             smb_dir,
639             smb_dir,
640             smb_dir,
641             smb_dir,
642             smb_dir,
643             exported_dir
644             );
645     fclose(f);
646     atexit(smb_exit);
647
648     snprintf(smb_cmdline, sizeof(smb_cmdline), "%s -s %s",
649              SMBD_COMMAND, smb_conf);
650
651     slirp_add_exec(0, smb_cmdline, 4, 139);
652 }
653
654 #endif /* !defined(_WIN32) */
655 void do_info_slirp(void)
656 {
657     slirp_stats();
658 }
659
660 #endif /* CONFIG_SLIRP */
661
662 #if !defined(_WIN32)
663
664 typedef struct TAPState {
665     VLANClientState *vc;
666     int fd;
667     char down_script[1024];
668     char down_script_arg[128];
669 } TAPState;
670
671 #ifdef HAVE_IOVEC
672 static ssize_t tap_receive_iov(void *opaque, const struct iovec *iov,
673                                int iovcnt)
674 {
675     TAPState *s = opaque;
676     ssize_t len;
677
678     do {
679         len = writev(s->fd, iov, iovcnt);
680     } while (len == -1 && (errno == EINTR || errno == EAGAIN));
681
682     return len;
683 }
684 #endif
685
686 static void tap_receive(void *opaque, const uint8_t *buf, int size)
687 {
688     TAPState *s = opaque;
689     int ret;
690     for(;;) {
691         ret = write(s->fd, buf, size);
692         if (ret < 0 && (errno == EINTR || errno == EAGAIN)) {
693         } else {
694             break;
695         }
696     }
697 }
698
699 static void tap_send(void *opaque)
700 {
701     TAPState *s = opaque;
702     uint8_t buf[4096];
703     int size;
704
705 #ifdef __sun__
706     struct strbuf sbuf;
707     int f = 0;
708     sbuf.maxlen = sizeof(buf);
709     sbuf.buf = buf;
710     size = getmsg(s->fd, NULL, &sbuf, &f) >=0 ? sbuf.len : -1;
711 #else
712     size = read(s->fd, buf, sizeof(buf));
713 #endif
714     if (size > 0) {
715         qemu_send_packet(s->vc, buf, size);
716     }
717 }
718
719 /* fd support */
720
721 static TAPState *net_tap_fd_init(VLANState *vlan,
722                                  const char *model,
723                                  const char *name,
724                                  int fd)
725 {
726     TAPState *s;
727
728     s = qemu_mallocz(sizeof(TAPState));
729     s->fd = fd;
730     s->vc = qemu_new_vlan_client(vlan, model, name, tap_receive, NULL, s);
731 #ifdef HAVE_IOVEC
732     s->vc->fd_readv = tap_receive_iov;
733 #endif
734     qemu_set_fd_handler(s->fd, tap_send, NULL, s);
735     snprintf(s->vc->info_str, sizeof(s->vc->info_str), "fd=%d", fd);
736     return s;
737 }
738
739 #if defined (_BSD) || defined (__FreeBSD_kernel__)
740 static int tap_open(char *ifname, int ifname_size)
741 {
742     int fd;
743     char *dev;
744     struct stat s;
745
746     TFR(fd = open("/dev/tap", O_RDWR));
747     if (fd < 0) {
748         fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
749         return -1;
750     }
751
752     fstat(fd, &s);
753     dev = devname(s.st_rdev, S_IFCHR);
754     pstrcpy(ifname, ifname_size, dev);
755
756     fcntl(fd, F_SETFL, O_NONBLOCK);
757     return fd;
758 }
759 #elif defined(__sun__)
760 #define TUNNEWPPA       (('T'<<16) | 0x0001)
761 /*
762  * Allocate TAP device, returns opened fd.
763  * Stores dev name in the first arg(must be large enough).
764  */
765 int tap_alloc(char *dev, size_t dev_size)
766 {
767     int tap_fd, if_fd, ppa = -1;
768     static int ip_fd = 0;
769     char *ptr;
770
771     static int arp_fd = 0;
772     int ip_muxid, arp_muxid;
773     struct strioctl  strioc_if, strioc_ppa;
774     int link_type = I_PLINK;;
775     struct lifreq ifr;
776     char actual_name[32] = "";
777
778     memset(&ifr, 0x0, sizeof(ifr));
779
780     if( *dev ){
781        ptr = dev;
782        while( *ptr && !qemu_isdigit((int)*ptr) ) ptr++;
783        ppa = atoi(ptr);
784     }
785
786     /* Check if IP device was opened */
787     if( ip_fd )
788        close(ip_fd);
789
790     TFR(ip_fd = open("/dev/udp", O_RDWR, 0));
791     if (ip_fd < 0) {
792        syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)");
793        return -1;
794     }
795
796     TFR(tap_fd = open("/dev/tap", O_RDWR, 0));
797     if (tap_fd < 0) {
798        syslog(LOG_ERR, "Can't open /dev/tap");
799        return -1;
800     }
801
802     /* Assign a new PPA and get its unit number. */
803     strioc_ppa.ic_cmd = TUNNEWPPA;
804     strioc_ppa.ic_timout = 0;
805     strioc_ppa.ic_len = sizeof(ppa);
806     strioc_ppa.ic_dp = (char *)&ppa;
807     if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0)
808        syslog (LOG_ERR, "Can't assign new interface");
809
810     TFR(if_fd = open("/dev/tap", O_RDWR, 0));
811     if (if_fd < 0) {
812        syslog(LOG_ERR, "Can't open /dev/tap (2)");
813        return -1;
814     }
815     if(ioctl(if_fd, I_PUSH, "ip") < 0){
816        syslog(LOG_ERR, "Can't push IP module");
817        return -1;
818     }
819
820     if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) < 0)
821         syslog(LOG_ERR, "Can't get flags\n");
822
823     snprintf (actual_name, 32, "tap%d", ppa);
824     pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
825
826     ifr.lifr_ppa = ppa;
827     /* Assign ppa according to the unit number returned by tun device */
828
829     if (ioctl (if_fd, SIOCSLIFNAME, &ifr) < 0)
830         syslog (LOG_ERR, "Can't set PPA %d", ppa);
831     if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) <0)
832         syslog (LOG_ERR, "Can't get flags\n");
833     /* Push arp module to if_fd */
834     if (ioctl (if_fd, I_PUSH, "arp") < 0)
835         syslog (LOG_ERR, "Can't push ARP module (2)");
836
837     /* Push arp module to ip_fd */
838     if (ioctl (ip_fd, I_POP, NULL) < 0)
839         syslog (LOG_ERR, "I_POP failed\n");
840     if (ioctl (ip_fd, I_PUSH, "arp") < 0)
841         syslog (LOG_ERR, "Can't push ARP module (3)\n");
842     /* Open arp_fd */
843     TFR(arp_fd = open ("/dev/tap", O_RDWR, 0));
844     if (arp_fd < 0)
845        syslog (LOG_ERR, "Can't open %s\n", "/dev/tap");
846
847     /* Set ifname to arp */
848     strioc_if.ic_cmd = SIOCSLIFNAME;
849     strioc_if.ic_timout = 0;
850     strioc_if.ic_len = sizeof(ifr);
851     strioc_if.ic_dp = (char *)&ifr;
852     if (ioctl(arp_fd, I_STR, &strioc_if) < 0){
853         syslog (LOG_ERR, "Can't set ifname to arp\n");
854     }
855
856     if((ip_muxid = ioctl(ip_fd, I_LINK, if_fd)) < 0){
857        syslog(LOG_ERR, "Can't link TAP device to IP");
858        return -1;
859     }
860
861     if ((arp_muxid = ioctl (ip_fd, link_type, arp_fd)) < 0)
862         syslog (LOG_ERR, "Can't link TAP device to ARP");
863
864     close (if_fd);
865
866     memset(&ifr, 0x0, sizeof(ifr));
867     pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
868     ifr.lifr_ip_muxid  = ip_muxid;
869     ifr.lifr_arp_muxid = arp_muxid;
870
871     if (ioctl (ip_fd, SIOCSLIFMUXID, &ifr) < 0)
872     {
873       ioctl (ip_fd, I_PUNLINK , arp_muxid);
874       ioctl (ip_fd, I_PUNLINK, ip_muxid);
875       syslog (LOG_ERR, "Can't set multiplexor id");
876     }
877
878     snprintf(dev, dev_size, "tap%d", ppa);
879     return tap_fd;
880 }
881
882 static int tap_open(char *ifname, int ifname_size)
883 {
884     char  dev[10]="";
885     int fd;
886     if( (fd = tap_alloc(dev, sizeof(dev))) < 0 ){
887        fprintf(stderr, "Cannot allocate TAP device\n");
888        return -1;
889     }
890     pstrcpy(ifname, ifname_size, dev);
891     fcntl(fd, F_SETFL, O_NONBLOCK);
892     return fd;
893 }
894 #elif defined (_AIX)
895 static int tap_open(char *ifname, int ifname_size)
896 {
897     fprintf (stderr, "no tap on AIX\n");
898     return -1;
899 }
900 #else
901 static int tap_open(char *ifname, int ifname_size)
902 {
903     struct ifreq ifr;
904     int fd, ret;
905
906     TFR(fd = open("/dev/net/tun", O_RDWR));
907     if (fd < 0) {
908         fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
909         return -1;
910     }
911     memset(&ifr, 0, sizeof(ifr));
912     ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
913     if (ifname[0] != '\0')
914         pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
915     else
916         pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
917     ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
918     if (ret != 0) {
919         fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
920         close(fd);
921         return -1;
922     }
923     pstrcpy(ifname, ifname_size, ifr.ifr_name);
924     fcntl(fd, F_SETFL, O_NONBLOCK);
925     return fd;
926 }
927 #endif
928
929 static int launch_script(const char *setup_script, const char *ifname, int fd)
930 {
931     int pid, status;
932     char *args[3];
933     char **parg;
934
935         /* try to launch network script */
936         pid = fork();
937         if (pid >= 0) {
938             if (pid == 0) {
939                 int open_max = sysconf (_SC_OPEN_MAX), i;
940                 for (i = 0; i < open_max; i++)
941                     if (i != STDIN_FILENO &&
942                         i != STDOUT_FILENO &&
943                         i != STDERR_FILENO &&
944                         i != fd)
945                         close(i);
946
947                 parg = args;
948                 *parg++ = (char *)setup_script;
949                 *parg++ = (char *)ifname;
950                 *parg++ = NULL;
951                 execv(setup_script, args);
952                 _exit(1);
953             }
954             while (waitpid(pid, &status, 0) != pid);
955             if (!WIFEXITED(status) ||
956                 WEXITSTATUS(status) != 0) {
957                 fprintf(stderr, "%s: could not launch network script\n",
958                         setup_script);
959                 return -1;
960             }
961         }
962     return 0;
963 }
964
965 static int net_tap_init(VLANState *vlan, const char *model,
966                         const char *name, const char *ifname1,
967                         const char *setup_script, const char *down_script)
968 {
969     TAPState *s;
970     int fd;
971     char ifname[128];
972
973     if (ifname1 != NULL)
974         pstrcpy(ifname, sizeof(ifname), ifname1);
975     else
976         ifname[0] = '\0';
977     TFR(fd = tap_open(ifname, sizeof(ifname)));
978     if (fd < 0)
979         return -1;
980
981     if (!setup_script || !strcmp(setup_script, "no"))
982         setup_script = "";
983     if (setup_script[0] != '\0') {
984         if (launch_script(setup_script, ifname, fd))
985             return -1;
986     }
987     s = net_tap_fd_init(vlan, model, name, fd);
988     if (!s)
989         return -1;
990     snprintf(s->vc->info_str, sizeof(s->vc->info_str),
991              "ifname=%s,script=%s,downscript=%s",
992              ifname, setup_script, down_script);
993     if (down_script && strcmp(down_script, "no")) {
994         snprintf(s->down_script, sizeof(s->down_script), "%s", down_script);
995         snprintf(s->down_script_arg, sizeof(s->down_script_arg), "%s", ifname);
996     }
997     return 0;
998 }
999
1000 #endif /* !_WIN32 */
1001
1002 #if defined(CONFIG_VDE)
1003 typedef struct VDEState {
1004     VLANClientState *vc;
1005     VDECONN *vde;
1006 } VDEState;
1007
1008 static void vde_to_qemu(void *opaque)
1009 {
1010     VDEState *s = opaque;
1011     uint8_t buf[4096];
1012     int size;
1013
1014     size = vde_recv(s->vde, buf, sizeof(buf), 0);
1015     if (size > 0) {
1016         qemu_send_packet(s->vc, buf, size);
1017     }
1018 }
1019
1020 static void vde_from_qemu(void *opaque, const uint8_t *buf, int size)
1021 {
1022     VDEState *s = opaque;
1023     int ret;
1024     for(;;) {
1025         ret = vde_send(s->vde, buf, size, 0);
1026         if (ret < 0 && errno == EINTR) {
1027         } else {
1028             break;
1029         }
1030     }
1031 }
1032
1033 static int net_vde_init(VLANState *vlan, const char *model,
1034                         const char *name, const char *sock,
1035                         int port, const char *group, int mode)
1036 {
1037     VDEState *s;
1038     char *init_group = strlen(group) ? (char *)group : NULL;
1039     char *init_sock = strlen(sock) ? (char *)sock : NULL;
1040
1041     struct vde_open_args args = {
1042         .port = port,
1043         .group = init_group,
1044         .mode = mode,
1045     };
1046
1047     s = qemu_mallocz(sizeof(VDEState));
1048     s->vde = vde_open(init_sock, "QEMU", &args);
1049     if (!s->vde){
1050         free(s);
1051         return -1;
1052     }
1053     s->vc = qemu_new_vlan_client(vlan, model, name, vde_from_qemu, NULL, s);
1054     qemu_set_fd_handler(vde_datafd(s->vde), vde_to_qemu, NULL, s);
1055     snprintf(s->vc->info_str, sizeof(s->vc->info_str), "sock=%s,fd=%d",
1056              sock, vde_datafd(s->vde));
1057     return 0;
1058 }
1059 #endif
1060
1061 /* network connection */
1062 typedef struct NetSocketState {
1063     VLANClientState *vc;
1064     int fd;
1065     int state; /* 0 = getting length, 1 = getting data */
1066     int index;
1067     int packet_len;
1068     uint8_t buf[4096];
1069     struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
1070 } NetSocketState;
1071
1072 typedef struct NetSocketListenState {
1073     VLANState *vlan;
1074     char *model;
1075     char *name;
1076     int fd;
1077 } NetSocketListenState;
1078
1079 /* XXX: we consider we can send the whole packet without blocking */
1080 static void net_socket_receive(void *opaque, const uint8_t *buf, int size)
1081 {
1082     NetSocketState *s = opaque;
1083     uint32_t len;
1084     len = htonl(size);
1085
1086     send_all(s->fd, (const uint8_t *)&len, sizeof(len));
1087     send_all(s->fd, buf, size);
1088 }
1089
1090 static void net_socket_receive_dgram(void *opaque, const uint8_t *buf, int size)
1091 {
1092     NetSocketState *s = opaque;
1093     sendto(s->fd, buf, size, 0,
1094            (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
1095 }
1096
1097 static void net_socket_send(void *opaque)
1098 {
1099     NetSocketState *s = opaque;
1100     int l, size, err;
1101     uint8_t buf1[4096];
1102     const uint8_t *buf;
1103
1104     size = recv(s->fd, buf1, sizeof(buf1), 0);
1105     if (size < 0) {
1106         err = socket_error();
1107         if (err != EWOULDBLOCK)
1108             goto eoc;
1109     } else if (size == 0) {
1110         /* end of connection */
1111     eoc:
1112         qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1113         closesocket(s->fd);
1114         return;
1115     }
1116     buf = buf1;
1117     while (size > 0) {
1118         /* reassemble a packet from the network */
1119         switch(s->state) {
1120         case 0:
1121             l = 4 - s->index;
1122             if (l > size)
1123                 l = size;
1124             memcpy(s->buf + s->index, buf, l);
1125             buf += l;
1126             size -= l;
1127             s->index += l;
1128             if (s->index == 4) {
1129                 /* got length */
1130                 s->packet_len = ntohl(*(uint32_t *)s->buf);
1131                 s->index = 0;
1132                 s->state = 1;
1133             }
1134             break;
1135         case 1:
1136             l = s->packet_len - s->index;
1137             if (l > size)
1138                 l = size;
1139             memcpy(s->buf + s->index, buf, l);
1140             s->index += l;
1141             buf += l;
1142             size -= l;
1143             if (s->index >= s->packet_len) {
1144                 qemu_send_packet(s->vc, s->buf, s->packet_len);
1145                 s->index = 0;
1146                 s->state = 0;
1147             }
1148             break;
1149         }
1150     }
1151 }
1152
1153 static void net_socket_send_dgram(void *opaque)
1154 {
1155     NetSocketState *s = opaque;
1156     int size;
1157
1158     size = recv(s->fd, s->buf, sizeof(s->buf), 0);
1159     if (size < 0)
1160         return;
1161     if (size == 0) {
1162         /* end of connection */
1163         qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1164         return;
1165     }
1166     qemu_send_packet(s->vc, s->buf, size);
1167 }
1168
1169 static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
1170 {
1171     struct ip_mreq imr;
1172     int fd;
1173     int val, ret;
1174     if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
1175         fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
1176                 inet_ntoa(mcastaddr->sin_addr),
1177                 (int)ntohl(mcastaddr->sin_addr.s_addr));
1178         return -1;
1179
1180     }
1181     fd = socket(PF_INET, SOCK_DGRAM, 0);
1182     if (fd < 0) {
1183         perror("socket(PF_INET, SOCK_DGRAM)");
1184         return -1;
1185     }
1186
1187     val = 1;
1188     ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
1189                    (const char *)&val, sizeof(val));
1190     if (ret < 0) {
1191         perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
1192         goto fail;
1193     }
1194
1195     ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
1196     if (ret < 0) {
1197         perror("bind");
1198         goto fail;
1199     }
1200
1201     /* Add host to multicast group */
1202     imr.imr_multiaddr = mcastaddr->sin_addr;
1203     imr.imr_interface.s_addr = htonl(INADDR_ANY);
1204
1205     ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
1206                      (const char *)&imr, sizeof(struct ip_mreq));
1207     if (ret < 0) {
1208         perror("setsockopt(IP_ADD_MEMBERSHIP)");
1209         goto fail;
1210     }
1211
1212     /* Force mcast msgs to loopback (eg. several QEMUs in same host */
1213     val = 1;
1214     ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
1215                    (const char *)&val, sizeof(val));
1216     if (ret < 0) {
1217         perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
1218         goto fail;
1219     }
1220
1221     socket_set_nonblock(fd);
1222     return fd;
1223 fail:
1224     if (fd >= 0)
1225         closesocket(fd);
1226     return -1;
1227 }
1228
1229 static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan,
1230                                                 const char *model,
1231                                                 const char *name,
1232                                                 int fd, int is_connected)
1233 {
1234     struct sockaddr_in saddr;
1235     int newfd;
1236     socklen_t saddr_len;
1237     NetSocketState *s;
1238
1239     /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
1240      * Because this may be "shared" socket from a "master" process, datagrams would be recv()
1241      * by ONLY ONE process: we must "clone" this dgram socket --jjo
1242      */
1243
1244     if (is_connected) {
1245         if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
1246             /* must be bound */
1247             if (saddr.sin_addr.s_addr==0) {
1248                 fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
1249                         fd);
1250                 return NULL;
1251             }
1252             /* clone dgram socket */
1253             newfd = net_socket_mcast_create(&saddr);
1254             if (newfd < 0) {
1255                 /* error already reported by net_socket_mcast_create() */
1256                 close(fd);
1257                 return NULL;
1258             }
1259             /* clone newfd to fd, close newfd */
1260             dup2(newfd, fd);
1261             close(newfd);
1262
1263         } else {
1264             fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
1265                     fd, strerror(errno));
1266             return NULL;
1267         }
1268     }
1269
1270     s = qemu_mallocz(sizeof(NetSocketState));
1271     s->fd = fd;
1272
1273     s->vc = qemu_new_vlan_client(vlan, model, name, net_socket_receive_dgram, NULL, s);
1274     qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
1275
1276     /* mcast: save bound address as dst */
1277     if (is_connected) s->dgram_dst=saddr;
1278
1279     snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1280             "socket: fd=%d (%s mcast=%s:%d)",
1281             fd, is_connected? "cloned" : "",
1282             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
1283     return s;
1284 }
1285
1286 static void net_socket_connect(void *opaque)
1287 {
1288     NetSocketState *s = opaque;
1289     qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
1290 }
1291
1292 static NetSocketState *net_socket_fd_init_stream(VLANState *vlan,
1293                                                  const char *model,
1294                                                  const char *name,
1295                                                  int fd, int is_connected)
1296 {
1297     NetSocketState *s;
1298     s = qemu_mallocz(sizeof(NetSocketState));
1299     s->fd = fd;
1300     s->vc = qemu_new_vlan_client(vlan, model, name,
1301                                  net_socket_receive, NULL, s);
1302     snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1303              "socket: fd=%d", fd);
1304     if (is_connected) {
1305         net_socket_connect(s);
1306     } else {
1307         qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
1308     }
1309     return s;
1310 }
1311
1312 static NetSocketState *net_socket_fd_init(VLANState *vlan,
1313                                           const char *model, const char *name,
1314                                           int fd, int is_connected)
1315 {
1316     int so_type=-1, optlen=sizeof(so_type);
1317
1318     if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type,
1319         (socklen_t *)&optlen)< 0) {
1320         fprintf(stderr, "qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n", fd);
1321         return NULL;
1322     }
1323     switch(so_type) {
1324     case SOCK_DGRAM:
1325         return net_socket_fd_init_dgram(vlan, model, name, fd, is_connected);
1326     case SOCK_STREAM:
1327         return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
1328     default:
1329         /* who knows ... this could be a eg. a pty, do warn and continue as stream */
1330         fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
1331         return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
1332     }
1333     return NULL;
1334 }
1335
1336 static void net_socket_accept(void *opaque)
1337 {
1338     NetSocketListenState *s = opaque;
1339     NetSocketState *s1;
1340     struct sockaddr_in saddr;
1341     socklen_t len;
1342     int fd;
1343
1344     for(;;) {
1345         len = sizeof(saddr);
1346         fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
1347         if (fd < 0 && errno != EINTR) {
1348             return;
1349         } else if (fd >= 0) {
1350             break;
1351         }
1352     }
1353     s1 = net_socket_fd_init(s->vlan, s->model, s->name, fd, 1);
1354     if (!s1) {
1355         closesocket(fd);
1356     } else {
1357         snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
1358                  "socket: connection from %s:%d",
1359                  inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
1360     }
1361 }
1362
1363 static int net_socket_listen_init(VLANState *vlan,
1364                                   const char *model,
1365                                   const char *name,
1366                                   const char *host_str)
1367 {
1368     NetSocketListenState *s;
1369     int fd, val, ret;
1370     struct sockaddr_in saddr;
1371
1372     if (parse_host_port(&saddr, host_str) < 0)
1373         return -1;
1374
1375     s = qemu_mallocz(sizeof(NetSocketListenState));
1376
1377     fd = socket(PF_INET, SOCK_STREAM, 0);
1378     if (fd < 0) {
1379         perror("socket");
1380         return -1;
1381     }
1382     socket_set_nonblock(fd);
1383
1384     /* allow fast reuse */
1385     val = 1;
1386     setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
1387
1388     ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
1389     if (ret < 0) {
1390         perror("bind");
1391         return -1;
1392     }
1393     ret = listen(fd, 0);
1394     if (ret < 0) {
1395         perror("listen");
1396         return -1;
1397     }
1398     s->vlan = vlan;
1399     s->model = strdup(model);
1400     s->name = strdup(name);
1401     s->fd = fd;
1402     qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
1403     return 0;
1404 }
1405
1406 static int net_socket_connect_init(VLANState *vlan,
1407                                    const char *model,
1408                                    const char *name,
1409                                    const char *host_str)
1410 {
1411     NetSocketState *s;
1412     int fd, connected, ret, err;
1413     struct sockaddr_in saddr;
1414
1415     if (parse_host_port(&saddr, host_str) < 0)
1416         return -1;
1417
1418     fd = socket(PF_INET, SOCK_STREAM, 0);
1419     if (fd < 0) {
1420         perror("socket");
1421         return -1;
1422     }
1423     socket_set_nonblock(fd);
1424
1425     connected = 0;
1426     for(;;) {
1427         ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
1428         if (ret < 0) {
1429             err = socket_error();
1430             if (err == EINTR || err == EWOULDBLOCK) {
1431             } else if (err == EINPROGRESS) {
1432                 break;
1433 #ifdef _WIN32
1434             } else if (err == WSAEALREADY) {
1435                 break;
1436 #endif
1437             } else {
1438                 perror("connect");
1439                 closesocket(fd);
1440                 return -1;
1441             }
1442         } else {
1443             connected = 1;
1444             break;
1445         }
1446     }
1447     s = net_socket_fd_init(vlan, model, name, fd, connected);
1448     if (!s)
1449         return -1;
1450     snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1451              "socket: connect to %s:%d",
1452              inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
1453     return 0;
1454 }
1455
1456 static int net_socket_mcast_init(VLANState *vlan,
1457                                  const char *model,
1458                                  const char *name,
1459                                  const char *host_str)
1460 {
1461     NetSocketState *s;
1462     int fd;
1463     struct sockaddr_in saddr;
1464
1465     if (parse_host_port(&saddr, host_str) < 0)
1466         return -1;
1467
1468
1469     fd = net_socket_mcast_create(&saddr);
1470     if (fd < 0)
1471         return -1;
1472
1473     s = net_socket_fd_init(vlan, model, name, fd, 0);
1474     if (!s)
1475         return -1;
1476
1477     s->dgram_dst = saddr;
1478
1479     snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1480              "socket: mcast=%s:%d",
1481              inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
1482     return 0;
1483
1484 }
1485
1486 /* find or alloc a new VLAN */
1487 VLANState *qemu_find_vlan(int id)
1488 {
1489     VLANState **pvlan, *vlan;
1490     for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
1491         if (vlan->id == id)
1492             return vlan;
1493     }
1494     vlan = qemu_mallocz(sizeof(VLANState));
1495     vlan->id = id;
1496     vlan->next = NULL;
1497     pvlan = &first_vlan;
1498     while (*pvlan != NULL)
1499         pvlan = &(*pvlan)->next;
1500     *pvlan = vlan;
1501     return vlan;
1502 }
1503
1504 void qemu_check_nic_model(NICInfo *nd, const char *model)
1505 {
1506     const char *models[2];
1507
1508     models[0] = model;
1509     models[1] = NULL;
1510
1511     qemu_check_nic_model_list(nd, models, model);
1512 }
1513
1514 void qemu_check_nic_model_list(NICInfo *nd, const char * const *models,
1515                                const char *default_model)
1516 {
1517     int i, exit_status = 0;
1518
1519     if (!nd->model)
1520         nd->model = strdup(default_model);
1521
1522     if (strcmp(nd->model, "?") != 0) {
1523         for (i = 0 ; models[i]; i++)
1524             if (strcmp(nd->model, models[i]) == 0)
1525                 return;
1526
1527         fprintf(stderr, "qemu: Unsupported NIC model: %s\n", nd->model);
1528         exit_status = 1;
1529     }
1530
1531     fprintf(stderr, "qemu: Supported NIC models: ");
1532     for (i = 0 ; models[i]; i++)
1533         fprintf(stderr, "%s%c", models[i], models[i+1] ? ',' : '\n');
1534
1535     exit(exit_status);
1536 }
1537
1538 int net_client_init(const char *device, const char *p)
1539 {
1540     char buf[1024];
1541     int vlan_id, ret;
1542     VLANState *vlan;
1543     char *name = NULL;
1544
1545     vlan_id = 0;
1546     if (get_param_value(buf, sizeof(buf), "vlan", p)) {
1547         vlan_id = strtol(buf, NULL, 0);
1548     }
1549     vlan = qemu_find_vlan(vlan_id);
1550     if (!vlan) {
1551         fprintf(stderr, "Could not create vlan %d\n", vlan_id);
1552         return -1;
1553     }
1554     if (get_param_value(buf, sizeof(buf), "name", p)) {
1555         name = strdup(buf);
1556     }
1557     if (!strcmp(device, "nic")) {
1558         NICInfo *nd;
1559         uint8_t *macaddr;
1560
1561         if (nb_nics >= MAX_NICS) {
1562             fprintf(stderr, "Too Many NICs\n");
1563             return -1;
1564         }
1565         nd = &nd_table[nb_nics];
1566         macaddr = nd->macaddr;
1567         macaddr[0] = 0x52;
1568         macaddr[1] = 0x54;
1569         macaddr[2] = 0x00;
1570         macaddr[3] = 0x12;
1571         macaddr[4] = 0x34;
1572         macaddr[5] = 0x56 + nb_nics;
1573
1574         if (get_param_value(buf, sizeof(buf), "macaddr", p)) {
1575             if (parse_macaddr(macaddr, buf) < 0) {
1576                 fprintf(stderr, "invalid syntax for ethernet address\n");
1577                 return -1;
1578             }
1579         }
1580         if (get_param_value(buf, sizeof(buf), "model", p)) {
1581             nd->model = strdup(buf);
1582         }
1583         nd->vlan = vlan;
1584         nd->name = name;
1585         name = NULL;
1586         nb_nics++;
1587         vlan->nb_guest_devs++;
1588         ret = 0;
1589     } else
1590     if (!strcmp(device, "none")) {
1591         /* does nothing. It is needed to signal that no network cards
1592            are wanted */
1593         ret = 0;
1594     } else
1595 #ifdef CONFIG_SLIRP
1596     if (!strcmp(device, "user")) {
1597         if (get_param_value(buf, sizeof(buf), "hostname", p)) {
1598             pstrcpy(slirp_hostname, sizeof(slirp_hostname), buf);
1599         }
1600         if (get_param_value(buf, sizeof(buf), "restrict", p)) {
1601             slirp_restrict = (buf[0] == 'y') ? 1 : 0;
1602         }
1603         if (get_param_value(buf, sizeof(buf), "ip", p)) {
1604             slirp_ip = strdup(buf);
1605         }
1606         vlan->nb_host_devs++;
1607         ret = net_slirp_init(vlan, device, name);
1608     } else
1609 #endif
1610 #ifdef _WIN32
1611     if (!strcmp(device, "tap")) {
1612         char ifname[64];
1613         if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
1614             fprintf(stderr, "tap: no interface name\n");
1615             return -1;
1616         }
1617         vlan->nb_host_devs++;
1618         ret = tap_win32_init(vlan, device, name, ifname);
1619     } else
1620 #elif defined (_AIX)
1621 #else
1622     if (!strcmp(device, "tap")) {
1623         char ifname[64];
1624         char setup_script[1024], down_script[1024];
1625         int fd;
1626         vlan->nb_host_devs++;
1627         if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
1628             fd = strtol(buf, NULL, 0);
1629             fcntl(fd, F_SETFL, O_NONBLOCK);
1630             ret = -1;
1631             if (net_tap_fd_init(vlan, device, name, fd))
1632                 ret = 0;
1633         } else {
1634             if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
1635                 ifname[0] = '\0';
1636             }
1637             if (get_param_value(setup_script, sizeof(setup_script), "script", p) == 0) {
1638                 pstrcpy(setup_script, sizeof(setup_script), DEFAULT_NETWORK_SCRIPT);
1639             }
1640             if (get_param_value(down_script, sizeof(down_script), "downscript", p) == 0) {
1641                 pstrcpy(down_script, sizeof(down_script), DEFAULT_NETWORK_DOWN_SCRIPT);
1642             }
1643             ret = net_tap_init(vlan, device, name, ifname, setup_script, down_script);
1644         }
1645     } else
1646 #endif
1647     if (!strcmp(device, "socket")) {
1648         if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
1649             int fd;
1650             fd = strtol(buf, NULL, 0);
1651             ret = -1;
1652             if (net_socket_fd_init(vlan, device, name, fd, 1))
1653                 ret = 0;
1654         } else if (get_param_value(buf, sizeof(buf), "listen", p) > 0) {
1655             ret = net_socket_listen_init(vlan, device, name, buf);
1656         } else if (get_param_value(buf, sizeof(buf), "connect", p) > 0) {
1657             ret = net_socket_connect_init(vlan, device, name, buf);
1658         } else if (get_param_value(buf, sizeof(buf), "mcast", p) > 0) {
1659             ret = net_socket_mcast_init(vlan, device, name, buf);
1660         } else {
1661             fprintf(stderr, "Unknown socket options: %s\n", p);
1662             return -1;
1663         }
1664         vlan->nb_host_devs++;
1665     } else
1666 #ifdef CONFIG_VDE
1667     if (!strcmp(device, "vde")) {
1668         char vde_sock[1024], vde_group[512];
1669         int vde_port, vde_mode;
1670         vlan->nb_host_devs++;
1671         if (get_param_value(vde_sock, sizeof(vde_sock), "sock", p) <= 0) {
1672             vde_sock[0] = '\0';
1673         }
1674         if (get_param_value(buf, sizeof(buf), "port", p) > 0) {
1675             vde_port = strtol(buf, NULL, 10);
1676         } else {
1677             vde_port = 0;
1678         }
1679         if (get_param_value(vde_group, sizeof(vde_group), "group", p) <= 0) {
1680             vde_group[0] = '\0';
1681         }
1682         if (get_param_value(buf, sizeof(buf), "mode", p) > 0) {
1683             vde_mode = strtol(buf, NULL, 8);
1684         } else {
1685             vde_mode = 0700;
1686         }
1687         ret = net_vde_init(vlan, device, name, vde_sock, vde_port, vde_group, vde_mode);
1688     } else
1689 #endif
1690     {
1691         fprintf(stderr, "Unknown network device: %s\n", device);
1692         if (name)
1693             free(name);
1694         return -1;
1695     }
1696     if (ret < 0) {
1697         fprintf(stderr, "Could not initialize device '%s'\n", device);
1698     }
1699     if (name)
1700         free(name);
1701     return ret;
1702 }
1703
1704 int net_client_parse(const char *str)
1705 {
1706     const char *p;
1707     char *q;
1708     char device[64];
1709
1710     p = str;
1711     q = device;
1712     while (*p != '\0' && *p != ',') {
1713         if ((q - device) < sizeof(device) - 1)
1714             *q++ = *p;
1715         p++;
1716     }
1717     *q = '\0';
1718     if (*p == ',')
1719         p++;
1720
1721     return net_client_init(device, p);
1722 }
1723
1724 void do_info_network(void)
1725 {
1726     VLANState *vlan;
1727     VLANClientState *vc;
1728
1729     for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
1730         term_printf("VLAN %d devices:\n", vlan->id);
1731         for(vc = vlan->first_client; vc != NULL; vc = vc->next)
1732             term_printf("  %s: %s\n", vc->name, vc->info_str);
1733     }
1734 }
1735
1736 int do_set_link(const char *name, const char *up_or_down)
1737 {
1738     VLANState *vlan;
1739     VLANClientState *vc = NULL;
1740
1741     for (vlan = first_vlan; vlan != NULL; vlan = vlan->next)
1742         for (vc = vlan->first_client; vc != NULL; vc = vc->next)
1743             if (strcmp(vc->name, name) == 0)
1744                 goto done;
1745 done:
1746
1747     if (!vc) {
1748         term_printf("could not find network device '%s'", name);
1749         return 0;
1750     }
1751
1752     if (strcmp(up_or_down, "up") == 0)
1753         vc->link_down = 0;
1754     else if (strcmp(up_or_down, "down") == 0)
1755         vc->link_down = 1;
1756     else
1757         term_printf("invalid link status '%s'; only 'up' or 'down' valid\n",
1758                     up_or_down);
1759
1760     if (vc->link_status_changed)
1761         vc->link_status_changed(vc);
1762
1763     return 1;
1764 }
1765
1766 void net_cleanup(void)
1767 {
1768     VLANState *vlan;
1769
1770 #if !defined(_WIN32)
1771     /* close network clients */
1772     for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
1773         VLANClientState *vc;
1774
1775         for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
1776             if (vc->fd_read == tap_receive) {
1777                 TAPState *s = vc->opaque;
1778
1779                 if (s->down_script[0])
1780                     launch_script(s->down_script, s->down_script_arg, s->fd);
1781             }
1782 #if defined(CONFIG_VDE)
1783             if (vc->fd_read == vde_from_qemu) {
1784                 VDEState *s = vc->opaque;
1785                 vde_close(s->vde);
1786             }
1787 #endif
1788         }
1789     }
1790 #endif
1791 }
1792
1793 void net_client_check(void)
1794 {
1795     VLANState *vlan;
1796
1797     for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
1798         if (vlan->nb_guest_devs == 0 && vlan->nb_host_devs == 0)
1799             continue;
1800         if (vlan->nb_guest_devs == 0)
1801             fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id);
1802         if (vlan->nb_host_devs == 0)
1803             fprintf(stderr,
1804                     "Warning: vlan %d is not connected to host network\n",
1805                     vlan->id);
1806     }
1807 }