Statistics
| Branch: | Revision:

root / net.c @ 9036de1a

History | View | Annotate | Download (50 kB)

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 <unistd.h>
25
#include <fcntl.h>
26
#include <signal.h>
27
#include <time.h>
28
#include <errno.h>
29
#include <sys/time.h>
30
#include <zlib.h>
31

    
32
/* Needed early for HOST_BSD etc. */
33
#include "config-host.h"
34

    
35
#ifndef _WIN32
36
#include <sys/times.h>
37
#include <sys/wait.h>
38
#include <termios.h>
39
#include <sys/mman.h>
40
#include <sys/ioctl.h>
41
#include <sys/resource.h>
42
#include <sys/socket.h>
43
#include <netinet/in.h>
44
#include <net/if.h>
45
#ifdef __NetBSD__
46
#include <net/if_tap.h>
47
#endif
48
#ifdef __linux__
49
#include <linux/if_tun.h>
50
#endif
51
#include <arpa/inet.h>
52
#include <dirent.h>
53
#include <netdb.h>
54
#include <sys/select.h>
55
#ifdef HOST_BSD
56
#include <sys/stat.h>
57
#if defined(__FreeBSD__) || defined(__DragonFly__)
58
#include <libutil.h>
59
#else
60
#include <util.h>
61
#endif
62
#elif defined (__GLIBC__) && defined (__FreeBSD_kernel__)
63
#include <freebsd/stdlib.h>
64
#else
65
#ifdef __linux__
66
#include <pty.h>
67
#include <malloc.h>
68
#include <linux/rtc.h>
69

    
70
/* For the benefit of older linux systems which don't supply it,
71
   we use a local copy of hpet.h. */
72
/* #include <linux/hpet.h> */
73
#include "hpet.h"
74

    
75
#include <linux/ppdev.h>
76
#include <linux/parport.h>
77
#endif
78
#ifdef __sun__
79
#include <sys/stat.h>
80
#include <sys/ethernet.h>
81
#include <sys/sockio.h>
82
#include <netinet/arp.h>
83
#include <netinet/in.h>
84
#include <netinet/in_systm.h>
85
#include <netinet/ip.h>
86
#include <netinet/ip_icmp.h> // must come after ip.h
87
#include <netinet/udp.h>
88
#include <netinet/tcp.h>
89
#include <net/if.h>
90
#include <syslog.h>
91
#include <stropts.h>
92
#endif
93
#endif
94
#endif
95

    
96
#if defined(__OpenBSD__)
97
#include <util.h>
98
#endif
99

    
100
#if defined(CONFIG_VDE)
101
#include <libvdeplug.h>
102
#endif
103

    
104
#ifdef _WIN32
105
#include <windows.h>
106
#include <malloc.h>
107
#include <sys/timeb.h>
108
#include <mmsystem.h>
109
#define getopt_long_only getopt_long
110
#define memalign(align, size) malloc(size)
111
#endif
112

    
113
#include "qemu-common.h"
114
#include "net.h"
115
#include "monitor.h"
116
#include "sysemu.h"
117
#include "qemu-timer.h"
118
#include "qemu-char.h"
119
#include "audio/audio.h"
120
#include "qemu_socket.h"
121

    
122
#if defined(CONFIG_SLIRP)
123
#include "libslirp.h"
124
#endif
125

    
126

    
127
static VLANState *first_vlan;
128

    
129
/***********************************************************/
130
/* network device redirectors */
131

    
132
#if defined(DEBUG_NET) || defined(DEBUG_SLIRP)
133
static void hex_dump(FILE *f, const uint8_t *buf, int size)
134
{
135
    int len, i, j, c;
136

    
137
    for(i=0;i<size;i+=16) {
138
        len = size - i;
139
        if (len > 16)
140
            len = 16;
141
        fprintf(f, "%08x ", i);
142
        for(j=0;j<16;j++) {
143
            if (j < len)
144
                fprintf(f, " %02x", buf[i+j]);
145
            else
146
                fprintf(f, "   ");
147
        }
148
        fprintf(f, " ");
149
        for(j=0;j<len;j++) {
150
            c = buf[i+j];
151
            if (c < ' ' || c > '~')
152
                c = '.';
153
            fprintf(f, "%c", c);
154
        }
155
        fprintf(f, "\n");
156
    }
157
}
158
#endif
159

    
160
static int parse_macaddr(uint8_t *macaddr, const char *p)
161
{
162
    int i;
163
    char *last_char;
164
    long int offset;
165

    
166
    errno = 0;
167
    offset = strtol(p, &last_char, 0);    
168
    if (0 == errno && '\0' == *last_char &&
169
            offset >= 0 && offset <= 0xFFFFFF) {
170
        macaddr[3] = (offset & 0xFF0000) >> 16;
171
        macaddr[4] = (offset & 0xFF00) >> 8;
172
        macaddr[5] = offset & 0xFF;
173
        return 0;
174
    } else {
175
        for(i = 0; i < 6; i++) {
176
            macaddr[i] = strtol(p, (char **)&p, 16);
177
            if (i == 5) {
178
                if (*p != '\0')
179
                    return -1;
180
            } else {
181
                if (*p != ':' && *p != '-')
182
                    return -1;
183
                p++;
184
            }
185
        }
186
        return 0;    
187
    }
188

    
189
    return -1;
190
}
191

    
192
static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
193
{
194
    const char *p, *p1;
195
    int len;
196
    p = *pp;
197
    p1 = strchr(p, sep);
198
    if (!p1)
199
        return -1;
200
    len = p1 - p;
201
    p1++;
202
    if (buf_size > 0) {
203
        if (len > buf_size - 1)
204
            len = buf_size - 1;
205
        memcpy(buf, p, len);
206
        buf[len] = '\0';
207
    }
208
    *pp = p1;
209
    return 0;
210
}
211

    
212
int parse_host_src_port(struct sockaddr_in *haddr,
213
                        struct sockaddr_in *saddr,
214
                        const char *input_str)
215
{
216
    char *str = strdup(input_str);
217
    char *host_str = str;
218
    char *src_str;
219
    const char *src_str2;
220
    char *ptr;
221

    
222
    /*
223
     * Chop off any extra arguments at the end of the string which
224
     * would start with a comma, then fill in the src port information
225
     * if it was provided else use the "any address" and "any port".
226
     */
227
    if ((ptr = strchr(str,',')))
228
        *ptr = '\0';
229

    
230
    if ((src_str = strchr(input_str,'@'))) {
231
        *src_str = '\0';
232
        src_str++;
233
    }
234

    
235
    if (parse_host_port(haddr, host_str) < 0)
236
        goto fail;
237

    
238
    src_str2 = src_str;
239
    if (!src_str || *src_str == '\0')
240
        src_str2 = ":0";
241

    
242
    if (parse_host_port(saddr, src_str2) < 0)
243
        goto fail;
244

    
245
    free(str);
246
    return(0);
247

    
248
fail:
249
    free(str);
250
    return -1;
251
}
252

    
253
int parse_host_port(struct sockaddr_in *saddr, const char *str)
254
{
255
    char buf[512];
256
    struct hostent *he;
257
    const char *p, *r;
258
    int port;
259

    
260
    p = str;
261
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
262
        return -1;
263
    saddr->sin_family = AF_INET;
264
    if (buf[0] == '\0') {
265
        saddr->sin_addr.s_addr = 0;
266
    } else {
267
        if (qemu_isdigit(buf[0])) {
268
            if (!inet_aton(buf, &saddr->sin_addr))
269
                return -1;
270
        } else {
271
            if ((he = gethostbyname(buf)) == NULL)
272
                return - 1;
273
            saddr->sin_addr = *(struct in_addr *)he->h_addr;
274
        }
275
    }
276
    port = strtol(p, (char **)&r, 0);
277
    if (r == p)
278
        return -1;
279
    saddr->sin_port = htons(port);
280
    return 0;
281
}
282

    
283
#if !defined(_WIN32) && 0
284
static int parse_unix_path(struct sockaddr_un *uaddr, const char *str)
285
{
286
    const char *p;
287
    int len;
288

    
289
    len = MIN(108, strlen(str));
290
    p = strchr(str, ',');
291
    if (p)
292
        len = MIN(len, p - str);
293

    
294
    memset(uaddr, 0, sizeof(*uaddr));
295

    
296
    uaddr->sun_family = AF_UNIX;
297
    memcpy(uaddr->sun_path, str, len);
298

    
299
    return 0;
300
}
301
#endif
302

    
303
void qemu_format_nic_info_str(VLANClientState *vc, uint8_t macaddr[6])
304
{
305
    snprintf(vc->info_str, sizeof(vc->info_str),
306
             "model=%s,macaddr=%02x:%02x:%02x:%02x:%02x:%02x",
307
             vc->model,
308
             macaddr[0], macaddr[1], macaddr[2],
309
             macaddr[3], macaddr[4], macaddr[5]);
310
}
311

    
312
static char *assign_name(VLANClientState *vc1, const char *model)
313
{
314
    VLANState *vlan;
315
    char buf[256];
316
    int id = 0;
317

    
318
    for (vlan = first_vlan; vlan; vlan = vlan->next) {
319
        VLANClientState *vc;
320

    
321
        for (vc = vlan->first_client; vc; vc = vc->next)
322
            if (vc != vc1 && strcmp(vc->model, model) == 0)
323
                id++;
324
    }
325

    
326
    snprintf(buf, sizeof(buf), "%s.%d", model, id);
327

    
328
    return strdup(buf);
329
}
330

    
331
VLANClientState *qemu_new_vlan_client(VLANState *vlan,
332
                                      const char *model,
333
                                      const char *name,
334
                                      IOReadHandler *fd_read,
335
                                      IOCanRWHandler *fd_can_read,
336
                                      void *opaque)
337
{
338
    VLANClientState *vc, **pvc;
339
    vc = qemu_mallocz(sizeof(VLANClientState));
340
    vc->model = strdup(model);
341
    if (name)
342
        vc->name = strdup(name);
343
    else
344
        vc->name = assign_name(vc, model);
345
    vc->fd_read = fd_read;
346
    vc->fd_can_read = fd_can_read;
347
    vc->opaque = opaque;
348
    vc->vlan = vlan;
349

    
350
    vc->next = NULL;
351
    pvc = &vlan->first_client;
352
    while (*pvc != NULL)
353
        pvc = &(*pvc)->next;
354
    *pvc = vc;
355
    return vc;
356
}
357

    
358
void qemu_del_vlan_client(VLANClientState *vc)
359
{
360
    VLANClientState **pvc = &vc->vlan->first_client;
361

    
362
    while (*pvc != NULL)
363
        if (*pvc == vc) {
364
            *pvc = vc->next;
365
            free(vc->name);
366
            free(vc->model);
367
            free(vc);
368
            break;
369
        } else
370
            pvc = &(*pvc)->next;
371
}
372

    
373
VLANClientState *qemu_find_vlan_client(VLANState *vlan, void *opaque)
374
{
375
    VLANClientState **pvc = &vlan->first_client;
376

    
377
    while (*pvc != NULL)
378
        if ((*pvc)->opaque == opaque)
379
            return *pvc;
380
        else
381
            pvc = &(*pvc)->next;
382

    
383
    return NULL;
384
}
385

    
386
int qemu_can_send_packet(VLANClientState *vc1)
387
{
388
    VLANState *vlan = vc1->vlan;
389
    VLANClientState *vc;
390

    
391
    for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
392
        if (vc != vc1) {
393
            if (vc->fd_can_read && vc->fd_can_read(vc->opaque))
394
                return 1;
395
        }
396
    }
397
    return 0;
398
}
399

    
400
void qemu_send_packet(VLANClientState *vc1, const uint8_t *buf, int size)
401
{
402
    VLANState *vlan = vc1->vlan;
403
    VLANClientState *vc;
404

    
405
    if (vc1->link_down)
406
        return;
407

    
408
#ifdef DEBUG_NET
409
    printf("vlan %d send:\n", vlan->id);
410
    hex_dump(stdout, buf, size);
411
#endif
412
    for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
413
        if (vc != vc1 && !vc->link_down) {
414
            vc->fd_read(vc->opaque, buf, size);
415
        }
416
    }
417
}
418

    
419
static ssize_t vc_sendv_compat(VLANClientState *vc, const struct iovec *iov,
420
                               int iovcnt)
421
{
422
    uint8_t buffer[4096];
423
    size_t offset = 0;
424
    int i;
425

    
426
    for (i = 0; i < iovcnt; i++) {
427
        size_t len;
428

    
429
        len = MIN(sizeof(buffer) - offset, iov[i].iov_len);
430
        memcpy(buffer + offset, iov[i].iov_base, len);
431
        offset += len;
432
    }
433

    
434
    vc->fd_read(vc->opaque, buffer, offset);
435

    
436
    return offset;
437
}
438

    
439
static ssize_t calc_iov_length(const struct iovec *iov, int iovcnt)
440
{
441
    size_t offset = 0;
442
    int i;
443

    
444
    for (i = 0; i < iovcnt; i++)
445
        offset += iov[i].iov_len;
446
    return offset;
447
}
448

    
449
ssize_t qemu_sendv_packet(VLANClientState *vc1, const struct iovec *iov,
450
                          int iovcnt)
451
{
452
    VLANState *vlan = vc1->vlan;
453
    VLANClientState *vc;
454
    ssize_t max_len = 0;
455

    
456
    if (vc1->link_down)
457
        return calc_iov_length(iov, iovcnt);
458

    
459
    for (vc = vlan->first_client; vc != NULL; vc = vc->next) {
460
        ssize_t len = 0;
461

    
462
        if (vc == vc1)
463
            continue;
464

    
465
        if (vc->link_down)
466
            len = calc_iov_length(iov, iovcnt);
467
        if (vc->fd_readv)
468
            len = vc->fd_readv(vc->opaque, iov, iovcnt);
469
        else if (vc->fd_read)
470
            len = vc_sendv_compat(vc, iov, iovcnt);
471

    
472
        max_len = MAX(max_len, len);
473
    }
474

    
475
    return max_len;
476
}
477

    
478
#if defined(CONFIG_SLIRP)
479

    
480
/* slirp network adapter */
481

    
482
static int slirp_inited;
483
static int slirp_restrict;
484
static char *slirp_ip;
485
static VLANClientState *slirp_vc;
486

    
487
int slirp_can_output(void)
488
{
489
    return !slirp_vc || qemu_can_send_packet(slirp_vc);
490
}
491

    
492
void slirp_output(const uint8_t *pkt, int pkt_len)
493
{
494
#ifdef DEBUG_SLIRP
495
    printf("slirp output:\n");
496
    hex_dump(stdout, pkt, pkt_len);
497
#endif
498
    if (!slirp_vc)
499
        return;
500
    qemu_send_packet(slirp_vc, pkt, pkt_len);
501
}
502

    
503
int slirp_is_inited(void)
504
{
505
    return slirp_inited;
506
}
507

    
508
static void slirp_receive(void *opaque, const uint8_t *buf, int size)
509
{
510
#ifdef DEBUG_SLIRP
511
    printf("slirp input:\n");
512
    hex_dump(stdout, buf, size);
513
#endif
514
    slirp_input(buf, size);
515
}
516

    
517
static int net_slirp_init(VLANState *vlan, const char *model, const char *name)
518
{
519
    if (!slirp_inited) {
520
        slirp_inited = 1;
521
        slirp_init(slirp_restrict, slirp_ip);
522
    }
523
    slirp_vc = qemu_new_vlan_client(vlan, model, name,
524
                                    slirp_receive, NULL, NULL);
525
    slirp_vc->info_str[0] = '\0';
526
    return 0;
527
}
528

    
529
void net_slirp_redir(const char *redir_str)
530
{
531
    int is_udp;
532
    char buf[256], *r;
533
    const char *p;
534
    struct in_addr guest_addr;
535
    int host_port, guest_port;
536

    
537
    if (!slirp_inited) {
538
        slirp_inited = 1;
539
        slirp_init(slirp_restrict, slirp_ip);
540
    }
541

    
542
    p = redir_str;
543
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
544
        goto fail;
545
    if (!strcmp(buf, "tcp")) {
546
        is_udp = 0;
547
    } else if (!strcmp(buf, "udp")) {
548
        is_udp = 1;
549
    } else {
550
        goto fail;
551
    }
552

    
553
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
554
        goto fail;
555
    host_port = strtol(buf, &r, 0);
556
    if (r == buf)
557
        goto fail;
558

    
559
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
560
        goto fail;
561
    if (buf[0] == '\0') {
562
        pstrcpy(buf, sizeof(buf), "10.0.2.15");
563
    }
564
    if (!inet_aton(buf, &guest_addr))
565
        goto fail;
566

    
567
    guest_port = strtol(p, &r, 0);
568
    if (r == p)
569
        goto fail;
570

    
571
    if (slirp_redir(is_udp, host_port, guest_addr, guest_port) < 0) {
572
        fprintf(stderr, "qemu: could not set up redirection\n");
573
        exit(1);
574
    }
575
    return;
576
 fail:
577
    fprintf(stderr, "qemu: syntax: -redir [tcp|udp]:host-port:[guest-host]:guest-port\n");
578
    exit(1);
579
}
580

    
581
#ifndef _WIN32
582

    
583
static char smb_dir[1024];
584

    
585
static void erase_dir(char *dir_name)
586
{
587
    DIR *d;
588
    struct dirent *de;
589
    char filename[1024];
590

    
591
    /* erase all the files in the directory */
592
    if ((d = opendir(dir_name)) != NULL) {
593
        for(;;) {
594
            de = readdir(d);
595
            if (!de)
596
                break;
597
            if (strcmp(de->d_name, ".") != 0 &&
598
                strcmp(de->d_name, "..") != 0) {
599
                snprintf(filename, sizeof(filename), "%s/%s",
600
                         smb_dir, de->d_name);
601
                if (unlink(filename) != 0)  /* is it a directory? */
602
                    erase_dir(filename);
603
            }
604
        }
605
        closedir(d);
606
        rmdir(dir_name);
607
    }
608
}
609

    
610
/* automatic user mode samba server configuration */
611
static void smb_exit(void)
612
{
613
    erase_dir(smb_dir);
614
}
615

    
616
/* automatic user mode samba server configuration */
617
void net_slirp_smb(const char *exported_dir)
618
{
619
    char smb_conf[1024];
620
    char smb_cmdline[1024];
621
    FILE *f;
622

    
623
    if (!slirp_inited) {
624
        slirp_inited = 1;
625
        slirp_init(slirp_restrict, slirp_ip);
626
    }
627

    
628
    /* XXX: better tmp dir construction */
629
    snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%ld", (long)getpid());
630
    if (mkdir(smb_dir, 0700) < 0) {
631
        fprintf(stderr, "qemu: could not create samba server dir '%s'\n", smb_dir);
632
        exit(1);
633
    }
634
    snprintf(smb_conf, sizeof(smb_conf), "%s/%s", smb_dir, "smb.conf");
635

    
636
    f = fopen(smb_conf, "w");
637
    if (!f) {
638
        fprintf(stderr, "qemu: could not create samba server configuration file '%s'\n", smb_conf);
639
        exit(1);
640
    }
641
    fprintf(f,
642
            "[global]\n"
643
            "private dir=%s\n"
644
            "smb ports=0\n"
645
            "socket address=127.0.0.1\n"
646
            "pid directory=%s\n"
647
            "lock directory=%s\n"
648
            "log file=%s/log.smbd\n"
649
            "smb passwd file=%s/smbpasswd\n"
650
            "security = share\n"
651
            "[qemu]\n"
652
            "path=%s\n"
653
            "read only=no\n"
654
            "guest ok=yes\n",
655
            smb_dir,
656
            smb_dir,
657
            smb_dir,
658
            smb_dir,
659
            smb_dir,
660
            exported_dir
661
            );
662
    fclose(f);
663
    atexit(smb_exit);
664

    
665
    snprintf(smb_cmdline, sizeof(smb_cmdline), "%s -s %s",
666
             SMBD_COMMAND, smb_conf);
667

    
668
    slirp_add_exec(0, smb_cmdline, 4, 139);
669
}
670

    
671
#endif /* !defined(_WIN32) */
672
void do_info_slirp(Monitor *mon)
673
{
674
    slirp_stats();
675
}
676

    
677
struct VMChannel {
678
    CharDriverState *hd;
679
    int port;
680
};
681

    
682
static int vmchannel_can_read(void *opaque)
683
{
684
    struct VMChannel *vmc = (struct VMChannel*)opaque;
685
    return slirp_socket_can_recv(4, vmc->port);
686
}
687

    
688
static void vmchannel_read(void *opaque, const uint8_t *buf, int size)
689
{
690
    struct VMChannel *vmc = (struct VMChannel*)opaque;
691
    slirp_socket_recv(4, vmc->port, buf, size);
692
}
693

    
694
#endif /* CONFIG_SLIRP */
695

    
696
#if !defined(_WIN32)
697

    
698
typedef struct TAPState {
699
    VLANClientState *vc;
700
    int fd;
701
    char down_script[1024];
702
    char down_script_arg[128];
703
} TAPState;
704

    
705
static ssize_t tap_receive_iov(void *opaque, const struct iovec *iov,
706
                               int iovcnt)
707
{
708
    TAPState *s = opaque;
709
    ssize_t len;
710

    
711
    do {
712
        len = writev(s->fd, iov, iovcnt);
713
    } while (len == -1 && (errno == EINTR || errno == EAGAIN));
714

    
715
    return len;
716
}
717

    
718
static void tap_receive(void *opaque, const uint8_t *buf, int size)
719
{
720
    TAPState *s = opaque;
721
    int ret;
722
    for(;;) {
723
        ret = write(s->fd, buf, size);
724
        if (ret < 0 && (errno == EINTR || errno == EAGAIN)) {
725
        } else {
726
            break;
727
        }
728
    }
729
}
730

    
731
static void tap_send(void *opaque)
732
{
733
    TAPState *s = opaque;
734
    uint8_t buf[4096];
735
    int size;
736

    
737
#ifdef __sun__
738
    struct strbuf sbuf;
739
    int f = 0;
740
    sbuf.maxlen = sizeof(buf);
741
    sbuf.buf = (char *)buf;
742
    size = getmsg(s->fd, NULL, &sbuf, &f) >=0 ? sbuf.len : -1;
743
#else
744
    size = read(s->fd, buf, sizeof(buf));
745
#endif
746
    if (size > 0) {
747
        qemu_send_packet(s->vc, buf, size);
748
    }
749
}
750

    
751
/* fd support */
752

    
753
static TAPState *net_tap_fd_init(VLANState *vlan,
754
                                 const char *model,
755
                                 const char *name,
756
                                 int fd)
757
{
758
    TAPState *s;
759

    
760
    s = qemu_mallocz(sizeof(TAPState));
761
    s->fd = fd;
762
    s->vc = qemu_new_vlan_client(vlan, model, name, tap_receive, NULL, s);
763
    s->vc->fd_readv = tap_receive_iov;
764
    qemu_set_fd_handler(s->fd, tap_send, NULL, s);
765
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), "fd=%d", fd);
766
    return s;
767
}
768

    
769
#if defined (HOST_BSD) || defined (__FreeBSD_kernel__)
770
static int tap_open(char *ifname, int ifname_size)
771
{
772
    int fd;
773
    char *dev;
774
    struct stat s;
775

    
776
    TFR(fd = open("/dev/tap", O_RDWR));
777
    if (fd < 0) {
778
        fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
779
        return -1;
780
    }
781

    
782
    fstat(fd, &s);
783
    dev = devname(s.st_rdev, S_IFCHR);
784
    pstrcpy(ifname, ifname_size, dev);
785

    
786
    fcntl(fd, F_SETFL, O_NONBLOCK);
787
    return fd;
788
}
789
#elif defined(__sun__)
790
#define TUNNEWPPA       (('T'<<16) | 0x0001)
791
/*
792
 * Allocate TAP device, returns opened fd.
793
 * Stores dev name in the first arg(must be large enough).
794
 */
795
static int tap_alloc(char *dev, size_t dev_size)
796
{
797
    int tap_fd, if_fd, ppa = -1;
798
    static int ip_fd = 0;
799
    char *ptr;
800

    
801
    static int arp_fd = 0;
802
    int ip_muxid, arp_muxid;
803
    struct strioctl  strioc_if, strioc_ppa;
804
    int link_type = I_PLINK;;
805
    struct lifreq ifr;
806
    char actual_name[32] = "";
807

    
808
    memset(&ifr, 0x0, sizeof(ifr));
809

    
810
    if( *dev ){
811
       ptr = dev;
812
       while( *ptr && !qemu_isdigit((int)*ptr) ) ptr++;
813
       ppa = atoi(ptr);
814
    }
815

    
816
    /* Check if IP device was opened */
817
    if( ip_fd )
818
       close(ip_fd);
819

    
820
    TFR(ip_fd = open("/dev/udp", O_RDWR, 0));
821
    if (ip_fd < 0) {
822
       syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)");
823
       return -1;
824
    }
825

    
826
    TFR(tap_fd = open("/dev/tap", O_RDWR, 0));
827
    if (tap_fd < 0) {
828
       syslog(LOG_ERR, "Can't open /dev/tap");
829
       return -1;
830
    }
831

    
832
    /* Assign a new PPA and get its unit number. */
833
    strioc_ppa.ic_cmd = TUNNEWPPA;
834
    strioc_ppa.ic_timout = 0;
835
    strioc_ppa.ic_len = sizeof(ppa);
836
    strioc_ppa.ic_dp = (char *)&ppa;
837
    if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0)
838
       syslog (LOG_ERR, "Can't assign new interface");
839

    
840
    TFR(if_fd = open("/dev/tap", O_RDWR, 0));
841
    if (if_fd < 0) {
842
       syslog(LOG_ERR, "Can't open /dev/tap (2)");
843
       return -1;
844
    }
845
    if(ioctl(if_fd, I_PUSH, "ip") < 0){
846
       syslog(LOG_ERR, "Can't push IP module");
847
       return -1;
848
    }
849

    
850
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) < 0)
851
        syslog(LOG_ERR, "Can't get flags\n");
852

    
853
    snprintf (actual_name, 32, "tap%d", ppa);
854
    pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
855

    
856
    ifr.lifr_ppa = ppa;
857
    /* Assign ppa according to the unit number returned by tun device */
858

    
859
    if (ioctl (if_fd, SIOCSLIFNAME, &ifr) < 0)
860
        syslog (LOG_ERR, "Can't set PPA %d", ppa);
861
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) <0)
862
        syslog (LOG_ERR, "Can't get flags\n");
863
    /* Push arp module to if_fd */
864
    if (ioctl (if_fd, I_PUSH, "arp") < 0)
865
        syslog (LOG_ERR, "Can't push ARP module (2)");
866

    
867
    /* Push arp module to ip_fd */
868
    if (ioctl (ip_fd, I_POP, NULL) < 0)
869
        syslog (LOG_ERR, "I_POP failed\n");
870
    if (ioctl (ip_fd, I_PUSH, "arp") < 0)
871
        syslog (LOG_ERR, "Can't push ARP module (3)\n");
872
    /* Open arp_fd */
873
    TFR(arp_fd = open ("/dev/tap", O_RDWR, 0));
874
    if (arp_fd < 0)
875
       syslog (LOG_ERR, "Can't open %s\n", "/dev/tap");
876

    
877
    /* Set ifname to arp */
878
    strioc_if.ic_cmd = SIOCSLIFNAME;
879
    strioc_if.ic_timout = 0;
880
    strioc_if.ic_len = sizeof(ifr);
881
    strioc_if.ic_dp = (char *)&ifr;
882
    if (ioctl(arp_fd, I_STR, &strioc_if) < 0){
883
        syslog (LOG_ERR, "Can't set ifname to arp\n");
884
    }
885

    
886
    if((ip_muxid = ioctl(ip_fd, I_LINK, if_fd)) < 0){
887
       syslog(LOG_ERR, "Can't link TAP device to IP");
888
       return -1;
889
    }
890

    
891
    if ((arp_muxid = ioctl (ip_fd, link_type, arp_fd)) < 0)
892
        syslog (LOG_ERR, "Can't link TAP device to ARP");
893

    
894
    close (if_fd);
895

    
896
    memset(&ifr, 0x0, sizeof(ifr));
897
    pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
898
    ifr.lifr_ip_muxid  = ip_muxid;
899
    ifr.lifr_arp_muxid = arp_muxid;
900

    
901
    if (ioctl (ip_fd, SIOCSLIFMUXID, &ifr) < 0)
902
    {
903
      ioctl (ip_fd, I_PUNLINK , arp_muxid);
904
      ioctl (ip_fd, I_PUNLINK, ip_muxid);
905
      syslog (LOG_ERR, "Can't set multiplexor id");
906
    }
907

    
908
    snprintf(dev, dev_size, "tap%d", ppa);
909
    return tap_fd;
910
}
911

    
912
static int tap_open(char *ifname, int ifname_size)
913
{
914
    char  dev[10]="";
915
    int fd;
916
    if( (fd = tap_alloc(dev, sizeof(dev))) < 0 ){
917
       fprintf(stderr, "Cannot allocate TAP device\n");
918
       return -1;
919
    }
920
    pstrcpy(ifname, ifname_size, dev);
921
    fcntl(fd, F_SETFL, O_NONBLOCK);
922
    return fd;
923
}
924
#elif defined (_AIX)
925
static int tap_open(char *ifname, int ifname_size)
926
{
927
    fprintf (stderr, "no tap on AIX\n");
928
    return -1;
929
}
930
#else
931
static int tap_open(char *ifname, int ifname_size)
932
{
933
    struct ifreq ifr;
934
    int fd, ret;
935

    
936
    TFR(fd = open("/dev/net/tun", O_RDWR));
937
    if (fd < 0) {
938
        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
939
        return -1;
940
    }
941
    memset(&ifr, 0, sizeof(ifr));
942
    ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
943
    if (ifname[0] != '\0')
944
        pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
945
    else
946
        pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
947
    ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
948
    if (ret != 0) {
949
        fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
950
        close(fd);
951
        return -1;
952
    }
953
    pstrcpy(ifname, ifname_size, ifr.ifr_name);
954
    fcntl(fd, F_SETFL, O_NONBLOCK);
955
    return fd;
956
}
957
#endif
958

    
959
static int launch_script(const char *setup_script, const char *ifname, int fd)
960
{
961
    int pid, status;
962
    char *args[3];
963
    char **parg;
964

    
965
        /* try to launch network script */
966
        pid = fork();
967
        if (pid >= 0) {
968
            if (pid == 0) {
969
                int open_max = sysconf (_SC_OPEN_MAX), i;
970
                for (i = 0; i < open_max; i++)
971
                    if (i != STDIN_FILENO &&
972
                        i != STDOUT_FILENO &&
973
                        i != STDERR_FILENO &&
974
                        i != fd)
975
                        close(i);
976

    
977
                parg = args;
978
                *parg++ = (char *)setup_script;
979
                *parg++ = (char *)ifname;
980
                *parg++ = NULL;
981
                execv(setup_script, args);
982
                _exit(1);
983
            }
984
            while (waitpid(pid, &status, 0) != pid);
985
            if (!WIFEXITED(status) ||
986
                WEXITSTATUS(status) != 0) {
987
                fprintf(stderr, "%s: could not launch network script\n",
988
                        setup_script);
989
                return -1;
990
            }
991
        }
992
    return 0;
993
}
994

    
995
static int net_tap_init(VLANState *vlan, const char *model,
996
                        const char *name, const char *ifname1,
997
                        const char *setup_script, const char *down_script)
998
{
999
    TAPState *s;
1000
    int fd;
1001
    char ifname[128];
1002

    
1003
    if (ifname1 != NULL)
1004
        pstrcpy(ifname, sizeof(ifname), ifname1);
1005
    else
1006
        ifname[0] = '\0';
1007
    TFR(fd = tap_open(ifname, sizeof(ifname)));
1008
    if (fd < 0)
1009
        return -1;
1010

    
1011
    if (!setup_script || !strcmp(setup_script, "no"))
1012
        setup_script = "";
1013
    if (setup_script[0] != '\0') {
1014
        if (launch_script(setup_script, ifname, fd))
1015
            return -1;
1016
    }
1017
    s = net_tap_fd_init(vlan, model, name, fd);
1018
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1019
             "ifname=%s,script=%s,downscript=%s",
1020
             ifname, setup_script, down_script);
1021
    if (down_script && strcmp(down_script, "no")) {
1022
        snprintf(s->down_script, sizeof(s->down_script), "%s", down_script);
1023
        snprintf(s->down_script_arg, sizeof(s->down_script_arg), "%s", ifname);
1024
    }
1025
    return 0;
1026
}
1027

    
1028
#endif /* !_WIN32 */
1029

    
1030
#if defined(CONFIG_VDE)
1031
typedef struct VDEState {
1032
    VLANClientState *vc;
1033
    VDECONN *vde;
1034
} VDEState;
1035

    
1036
static void vde_to_qemu(void *opaque)
1037
{
1038
    VDEState *s = opaque;
1039
    uint8_t buf[4096];
1040
    int size;
1041

    
1042
    size = vde_recv(s->vde, buf, sizeof(buf), 0);
1043
    if (size > 0) {
1044
        qemu_send_packet(s->vc, buf, size);
1045
    }
1046
}
1047

    
1048
static void vde_from_qemu(void *opaque, const uint8_t *buf, int size)
1049
{
1050
    VDEState *s = opaque;
1051
    int ret;
1052
    for(;;) {
1053
        ret = vde_send(s->vde, buf, size, 0);
1054
        if (ret < 0 && errno == EINTR) {
1055
        } else {
1056
            break;
1057
        }
1058
    }
1059
}
1060

    
1061
static int net_vde_init(VLANState *vlan, const char *model,
1062
                        const char *name, const char *sock,
1063
                        int port, const char *group, int mode)
1064
{
1065
    VDEState *s;
1066
    char *init_group = strlen(group) ? (char *)group : NULL;
1067
    char *init_sock = strlen(sock) ? (char *)sock : NULL;
1068

    
1069
    struct vde_open_args args = {
1070
        .port = port,
1071
        .group = init_group,
1072
        .mode = mode,
1073
    };
1074

    
1075
    s = qemu_mallocz(sizeof(VDEState));
1076
    s->vde = vde_open(init_sock, "QEMU", &args);
1077
    if (!s->vde){
1078
        free(s);
1079
        return -1;
1080
    }
1081
    s->vc = qemu_new_vlan_client(vlan, model, name, vde_from_qemu, NULL, s);
1082
    qemu_set_fd_handler(vde_datafd(s->vde), vde_to_qemu, NULL, s);
1083
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), "sock=%s,fd=%d",
1084
             sock, vde_datafd(s->vde));
1085
    return 0;
1086
}
1087
#endif
1088

    
1089
/* network connection */
1090
typedef struct NetSocketState {
1091
    VLANClientState *vc;
1092
    int fd;
1093
    int state; /* 0 = getting length, 1 = getting data */
1094
    unsigned int index;
1095
    unsigned int packet_len;
1096
    uint8_t buf[4096];
1097
    struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
1098
} NetSocketState;
1099

    
1100
typedef struct NetSocketListenState {
1101
    VLANState *vlan;
1102
    char *model;
1103
    char *name;
1104
    int fd;
1105
} NetSocketListenState;
1106

    
1107
/* XXX: we consider we can send the whole packet without blocking */
1108
static void net_socket_receive(void *opaque, const uint8_t *buf, int size)
1109
{
1110
    NetSocketState *s = opaque;
1111
    uint32_t len;
1112
    len = htonl(size);
1113

    
1114
    send_all(s->fd, (const uint8_t *)&len, sizeof(len));
1115
    send_all(s->fd, buf, size);
1116
}
1117

    
1118
static void net_socket_receive_dgram(void *opaque, const uint8_t *buf, int size)
1119
{
1120
    NetSocketState *s = opaque;
1121
    sendto(s->fd, buf, size, 0,
1122
           (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
1123
}
1124

    
1125
static void net_socket_send(void *opaque)
1126
{
1127
    NetSocketState *s = opaque;
1128
    int size, err;
1129
    unsigned l;
1130
    uint8_t buf1[4096];
1131
    const uint8_t *buf;
1132

    
1133
    size = recv(s->fd, buf1, sizeof(buf1), 0);
1134
    if (size < 0) {
1135
        err = socket_error();
1136
        if (err != EWOULDBLOCK)
1137
            goto eoc;
1138
    } else if (size == 0) {
1139
        /* end of connection */
1140
    eoc:
1141
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1142
        closesocket(s->fd);
1143
        return;
1144
    }
1145
    buf = buf1;
1146
    while (size > 0) {
1147
        /* reassemble a packet from the network */
1148
        switch(s->state) {
1149
        case 0:
1150
            l = 4 - s->index;
1151
            if (l > size)
1152
                l = size;
1153
            memcpy(s->buf + s->index, buf, l);
1154
            buf += l;
1155
            size -= l;
1156
            s->index += l;
1157
            if (s->index == 4) {
1158
                /* got length */
1159
                s->packet_len = ntohl(*(uint32_t *)s->buf);
1160
                s->index = 0;
1161
                s->state = 1;
1162
            }
1163
            break;
1164
        case 1:
1165
            l = s->packet_len - s->index;
1166
            if (l > size)
1167
                l = size;
1168
            if (s->index + l <= sizeof(s->buf)) {
1169
                memcpy(s->buf + s->index, buf, l);
1170
            } else {
1171
                fprintf(stderr, "serious error: oversized packet received,"
1172
                    "connection terminated.\n");
1173
                s->state = 0;
1174
                goto eoc;
1175
            }
1176

    
1177
            s->index += l;
1178
            buf += l;
1179
            size -= l;
1180
            if (s->index >= s->packet_len) {
1181
                qemu_send_packet(s->vc, s->buf, s->packet_len);
1182
                s->index = 0;
1183
                s->state = 0;
1184
            }
1185
            break;
1186
        }
1187
    }
1188
}
1189

    
1190
static void net_socket_send_dgram(void *opaque)
1191
{
1192
    NetSocketState *s = opaque;
1193
    int size;
1194

    
1195
    size = recv(s->fd, s->buf, sizeof(s->buf), 0);
1196
    if (size < 0)
1197
        return;
1198
    if (size == 0) {
1199
        /* end of connection */
1200
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1201
        return;
1202
    }
1203
    qemu_send_packet(s->vc, s->buf, size);
1204
}
1205

    
1206
static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
1207
{
1208
    struct ip_mreq imr;
1209
    int fd;
1210
    int val, ret;
1211
    if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
1212
        fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
1213
                inet_ntoa(mcastaddr->sin_addr),
1214
                (int)ntohl(mcastaddr->sin_addr.s_addr));
1215
        return -1;
1216

    
1217
    }
1218
    fd = socket(PF_INET, SOCK_DGRAM, 0);
1219
    if (fd < 0) {
1220
        perror("socket(PF_INET, SOCK_DGRAM)");
1221
        return -1;
1222
    }
1223

    
1224
    val = 1;
1225
    ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
1226
                   (const char *)&val, sizeof(val));
1227
    if (ret < 0) {
1228
        perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
1229
        goto fail;
1230
    }
1231

    
1232
    ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
1233
    if (ret < 0) {
1234
        perror("bind");
1235
        goto fail;
1236
    }
1237

    
1238
    /* Add host to multicast group */
1239
    imr.imr_multiaddr = mcastaddr->sin_addr;
1240
    imr.imr_interface.s_addr = htonl(INADDR_ANY);
1241

    
1242
    ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
1243
                     (const char *)&imr, sizeof(struct ip_mreq));
1244
    if (ret < 0) {
1245
        perror("setsockopt(IP_ADD_MEMBERSHIP)");
1246
        goto fail;
1247
    }
1248

    
1249
    /* Force mcast msgs to loopback (eg. several QEMUs in same host */
1250
    val = 1;
1251
    ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
1252
                   (const char *)&val, sizeof(val));
1253
    if (ret < 0) {
1254
        perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
1255
        goto fail;
1256
    }
1257

    
1258
    socket_set_nonblock(fd);
1259
    return fd;
1260
fail:
1261
    if (fd >= 0)
1262
        closesocket(fd);
1263
    return -1;
1264
}
1265

    
1266
static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan,
1267
                                                const char *model,
1268
                                                const char *name,
1269
                                                int fd, int is_connected)
1270
{
1271
    struct sockaddr_in saddr;
1272
    int newfd;
1273
    socklen_t saddr_len;
1274
    NetSocketState *s;
1275

    
1276
    /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
1277
     * Because this may be "shared" socket from a "master" process, datagrams would be recv()
1278
     * by ONLY ONE process: we must "clone" this dgram socket --jjo
1279
     */
1280

    
1281
    if (is_connected) {
1282
        if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
1283
            /* must be bound */
1284
            if (saddr.sin_addr.s_addr==0) {
1285
                fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
1286
                        fd);
1287
                return NULL;
1288
            }
1289
            /* clone dgram socket */
1290
            newfd = net_socket_mcast_create(&saddr);
1291
            if (newfd < 0) {
1292
                /* error already reported by net_socket_mcast_create() */
1293
                close(fd);
1294
                return NULL;
1295
            }
1296
            /* clone newfd to fd, close newfd */
1297
            dup2(newfd, fd);
1298
            close(newfd);
1299

    
1300
        } else {
1301
            fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
1302
                    fd, strerror(errno));
1303
            return NULL;
1304
        }
1305
    }
1306

    
1307
    s = qemu_mallocz(sizeof(NetSocketState));
1308
    s->fd = fd;
1309

    
1310
    s->vc = qemu_new_vlan_client(vlan, model, name, net_socket_receive_dgram, NULL, s);
1311
    qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
1312

    
1313
    /* mcast: save bound address as dst */
1314
    if (is_connected) s->dgram_dst=saddr;
1315

    
1316
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1317
            "socket: fd=%d (%s mcast=%s:%d)",
1318
            fd, is_connected? "cloned" : "",
1319
            inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
1320
    return s;
1321
}
1322

    
1323
static void net_socket_connect(void *opaque)
1324
{
1325
    NetSocketState *s = opaque;
1326
    qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
1327
}
1328

    
1329
static NetSocketState *net_socket_fd_init_stream(VLANState *vlan,
1330
                                                 const char *model,
1331
                                                 const char *name,
1332
                                                 int fd, int is_connected)
1333
{
1334
    NetSocketState *s;
1335
    s = qemu_mallocz(sizeof(NetSocketState));
1336
    s->fd = fd;
1337
    s->vc = qemu_new_vlan_client(vlan, model, name,
1338
                                 net_socket_receive, NULL, s);
1339
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1340
             "socket: fd=%d", fd);
1341
    if (is_connected) {
1342
        net_socket_connect(s);
1343
    } else {
1344
        qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
1345
    }
1346
    return s;
1347
}
1348

    
1349
static NetSocketState *net_socket_fd_init(VLANState *vlan,
1350
                                          const char *model, const char *name,
1351
                                          int fd, int is_connected)
1352
{
1353
    int so_type=-1, optlen=sizeof(so_type);
1354

    
1355
    if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type,
1356
        (socklen_t *)&optlen)< 0) {
1357
        fprintf(stderr, "qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n", fd);
1358
        return NULL;
1359
    }
1360
    switch(so_type) {
1361
    case SOCK_DGRAM:
1362
        return net_socket_fd_init_dgram(vlan, model, name, fd, is_connected);
1363
    case SOCK_STREAM:
1364
        return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
1365
    default:
1366
        /* who knows ... this could be a eg. a pty, do warn and continue as stream */
1367
        fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
1368
        return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
1369
    }
1370
    return NULL;
1371
}
1372

    
1373
static void net_socket_accept(void *opaque)
1374
{
1375
    NetSocketListenState *s = opaque;
1376
    NetSocketState *s1;
1377
    struct sockaddr_in saddr;
1378
    socklen_t len;
1379
    int fd;
1380

    
1381
    for(;;) {
1382
        len = sizeof(saddr);
1383
        fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
1384
        if (fd < 0 && errno != EINTR) {
1385
            return;
1386
        } else if (fd >= 0) {
1387
            break;
1388
        }
1389
    }
1390
    s1 = net_socket_fd_init(s->vlan, s->model, s->name, fd, 1);
1391
    if (!s1) {
1392
        closesocket(fd);
1393
    } else {
1394
        snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
1395
                 "socket: connection from %s:%d",
1396
                 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
1397
    }
1398
}
1399

    
1400
static int net_socket_listen_init(VLANState *vlan,
1401
                                  const char *model,
1402
                                  const char *name,
1403
                                  const char *host_str)
1404
{
1405
    NetSocketListenState *s;
1406
    int fd, val, ret;
1407
    struct sockaddr_in saddr;
1408

    
1409
    if (parse_host_port(&saddr, host_str) < 0)
1410
        return -1;
1411

    
1412
    s = qemu_mallocz(sizeof(NetSocketListenState));
1413

    
1414
    fd = socket(PF_INET, SOCK_STREAM, 0);
1415
    if (fd < 0) {
1416
        perror("socket");
1417
        return -1;
1418
    }
1419
    socket_set_nonblock(fd);
1420

    
1421
    /* allow fast reuse */
1422
    val = 1;
1423
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
1424

    
1425
    ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
1426
    if (ret < 0) {
1427
        perror("bind");
1428
        return -1;
1429
    }
1430
    ret = listen(fd, 0);
1431
    if (ret < 0) {
1432
        perror("listen");
1433
        return -1;
1434
    }
1435
    s->vlan = vlan;
1436
    s->model = strdup(model);
1437
    s->name = strdup(name);
1438
    s->fd = fd;
1439
    qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
1440
    return 0;
1441
}
1442

    
1443
static int net_socket_connect_init(VLANState *vlan,
1444
                                   const char *model,
1445
                                   const char *name,
1446
                                   const char *host_str)
1447
{
1448
    NetSocketState *s;
1449
    int fd, connected, ret, err;
1450
    struct sockaddr_in saddr;
1451

    
1452
    if (parse_host_port(&saddr, host_str) < 0)
1453
        return -1;
1454

    
1455
    fd = socket(PF_INET, SOCK_STREAM, 0);
1456
    if (fd < 0) {
1457
        perror("socket");
1458
        return -1;
1459
    }
1460
    socket_set_nonblock(fd);
1461

    
1462
    connected = 0;
1463
    for(;;) {
1464
        ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
1465
        if (ret < 0) {
1466
            err = socket_error();
1467
            if (err == EINTR || err == EWOULDBLOCK) {
1468
            } else if (err == EINPROGRESS) {
1469
                break;
1470
#ifdef _WIN32
1471
            } else if (err == WSAEALREADY) {
1472
                break;
1473
#endif
1474
            } else {
1475
                perror("connect");
1476
                closesocket(fd);
1477
                return -1;
1478
            }
1479
        } else {
1480
            connected = 1;
1481
            break;
1482
        }
1483
    }
1484
    s = net_socket_fd_init(vlan, model, name, fd, connected);
1485
    if (!s)
1486
        return -1;
1487
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1488
             "socket: connect to %s:%d",
1489
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
1490
    return 0;
1491
}
1492

    
1493
static int net_socket_mcast_init(VLANState *vlan,
1494
                                 const char *model,
1495
                                 const char *name,
1496
                                 const char *host_str)
1497
{
1498
    NetSocketState *s;
1499
    int fd;
1500
    struct sockaddr_in saddr;
1501

    
1502
    if (parse_host_port(&saddr, host_str) < 0)
1503
        return -1;
1504

    
1505

    
1506
    fd = net_socket_mcast_create(&saddr);
1507
    if (fd < 0)
1508
        return -1;
1509

    
1510
    s = net_socket_fd_init(vlan, model, name, fd, 0);
1511
    if (!s)
1512
        return -1;
1513

    
1514
    s->dgram_dst = saddr;
1515

    
1516
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1517
             "socket: mcast=%s:%d",
1518
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
1519
    return 0;
1520

    
1521
}
1522

    
1523
/* find or alloc a new VLAN */
1524
VLANState *qemu_find_vlan(int id)
1525
{
1526
    VLANState **pvlan, *vlan;
1527
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
1528
        if (vlan->id == id)
1529
            return vlan;
1530
    }
1531
    vlan = qemu_mallocz(sizeof(VLANState));
1532
    vlan->id = id;
1533
    vlan->next = NULL;
1534
    pvlan = &first_vlan;
1535
    while (*pvlan != NULL)
1536
        pvlan = &(*pvlan)->next;
1537
    *pvlan = vlan;
1538
    return vlan;
1539
}
1540

    
1541
static int nic_get_free_idx(void)
1542
{
1543
    int index;
1544

    
1545
    for (index = 0; index < MAX_NICS; index++)
1546
        if (!nd_table[index].used)
1547
            return index;
1548
    return -1;
1549
}
1550

    
1551
void qemu_check_nic_model(NICInfo *nd, const char *model)
1552
{
1553
    const char *models[2];
1554

    
1555
    models[0] = model;
1556
    models[1] = NULL;
1557

    
1558
    qemu_check_nic_model_list(nd, models, model);
1559
}
1560

    
1561
void qemu_check_nic_model_list(NICInfo *nd, const char * const *models,
1562
                               const char *default_model)
1563
{
1564
    int i, exit_status = 0;
1565

    
1566
    if (!nd->model)
1567
        nd->model = strdup(default_model);
1568

    
1569
    if (strcmp(nd->model, "?") != 0) {
1570
        for (i = 0 ; models[i]; i++)
1571
            if (strcmp(nd->model, models[i]) == 0)
1572
                return;
1573

    
1574
        fprintf(stderr, "qemu: Unsupported NIC model: %s\n", nd->model);
1575
        exit_status = 1;
1576
    }
1577

    
1578
    fprintf(stderr, "qemu: Supported NIC models: ");
1579
    for (i = 0 ; models[i]; i++)
1580
        fprintf(stderr, "%s%c", models[i], models[i+1] ? ',' : '\n');
1581

    
1582
    exit(exit_status);
1583
}
1584

    
1585
int net_client_init(const char *device, const char *p)
1586
{
1587
    char buf[1024];
1588
    int vlan_id, ret;
1589
    VLANState *vlan;
1590
    char *name = NULL;
1591

    
1592
    vlan_id = 0;
1593
    if (get_param_value(buf, sizeof(buf), "vlan", p)) {
1594
        vlan_id = strtol(buf, NULL, 0);
1595
    }
1596
    vlan = qemu_find_vlan(vlan_id);
1597

    
1598
    if (get_param_value(buf, sizeof(buf), "name", p)) {
1599
        name = strdup(buf);
1600
    }
1601
    if (!strcmp(device, "nic")) {
1602
        NICInfo *nd;
1603
        uint8_t *macaddr;
1604
        int idx = nic_get_free_idx();
1605

    
1606
        if (idx == -1 || nb_nics >= MAX_NICS) {
1607
            fprintf(stderr, "Too Many NICs\n");
1608
            ret = -1;
1609
            goto out;
1610
        }
1611
        nd = &nd_table[idx];
1612
        macaddr = nd->macaddr;
1613
        macaddr[0] = 0x52;
1614
        macaddr[1] = 0x54;
1615
        macaddr[2] = 0x00;
1616
        macaddr[3] = 0x12;
1617
        macaddr[4] = 0x34;
1618
        macaddr[5] = 0x56 + idx;
1619

    
1620
        if (get_param_value(buf, sizeof(buf), "macaddr", p)) {
1621
            if (parse_macaddr(macaddr, buf) < 0) {
1622
                fprintf(stderr, "invalid syntax for ethernet address\n");
1623
                ret = -1;
1624
                goto out;
1625
            }
1626
        }
1627
        if (get_param_value(buf, sizeof(buf), "model", p)) {
1628
            nd->model = strdup(buf);
1629
        }
1630
        nd->vlan = vlan;
1631
        nd->name = name;
1632
        nd->used = 1;
1633
        name = NULL;
1634
        nb_nics++;
1635
        vlan->nb_guest_devs++;
1636
        ret = idx;
1637
    } else
1638
    if (!strcmp(device, "none")) {
1639
        /* does nothing. It is needed to signal that no network cards
1640
           are wanted */
1641
        ret = 0;
1642
    } else
1643
#ifdef CONFIG_SLIRP
1644
    if (!strcmp(device, "user")) {
1645
        if (get_param_value(buf, sizeof(buf), "hostname", p)) {
1646
            pstrcpy(slirp_hostname, sizeof(slirp_hostname), buf);
1647
        }
1648
        if (get_param_value(buf, sizeof(buf), "restrict", p)) {
1649
            slirp_restrict = (buf[0] == 'y') ? 1 : 0;
1650
        }
1651
        if (get_param_value(buf, sizeof(buf), "ip", p)) {
1652
            slirp_ip = strdup(buf);
1653
        }
1654
        vlan->nb_host_devs++;
1655
        ret = net_slirp_init(vlan, device, name);
1656
    } else if (!strcmp(device, "channel")) {
1657
        long port;
1658
        char name[20], *devname;
1659
        struct VMChannel *vmc;
1660

    
1661
        port = strtol(p, &devname, 10);
1662
        devname++;
1663
        if (port < 1 || port > 65535) {
1664
            fprintf(stderr, "vmchannel wrong port number\n");
1665
            ret = -1;
1666
            goto out;
1667
        }
1668
        vmc = malloc(sizeof(struct VMChannel));
1669
        snprintf(name, 20, "vmchannel%ld", port);
1670
        vmc->hd = qemu_chr_open(name, devname, NULL);
1671
        if (!vmc->hd) {
1672
            fprintf(stderr, "qemu: could not open vmchannel device"
1673
                    "'%s'\n", devname);
1674
            ret = -1;
1675
            goto out;
1676
        }
1677
        vmc->port = port;
1678
        slirp_add_exec(3, vmc->hd, 4, port);
1679
        qemu_chr_add_handlers(vmc->hd, vmchannel_can_read, vmchannel_read,
1680
                NULL, vmc);
1681
        ret = 0;
1682
    } else
1683
#endif
1684
#ifdef _WIN32
1685
    if (!strcmp(device, "tap")) {
1686
        char ifname[64];
1687
        if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
1688
            fprintf(stderr, "tap: no interface name\n");
1689
            ret = -1;
1690
            goto out;
1691
        }
1692
        vlan->nb_host_devs++;
1693
        ret = tap_win32_init(vlan, device, name, ifname);
1694
    } else
1695
#elif defined (_AIX)
1696
#else
1697
    if (!strcmp(device, "tap")) {
1698
        char ifname[64];
1699
        char setup_script[1024], down_script[1024];
1700
        int fd;
1701
        vlan->nb_host_devs++;
1702
        if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
1703
            fd = strtol(buf, NULL, 0);
1704
            fcntl(fd, F_SETFL, O_NONBLOCK);
1705
            net_tap_fd_init(vlan, device, name, fd);
1706
            ret = 0;
1707
        } else {
1708
            if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
1709
                ifname[0] = '\0';
1710
            }
1711
            if (get_param_value(setup_script, sizeof(setup_script), "script", p) == 0) {
1712
                pstrcpy(setup_script, sizeof(setup_script), DEFAULT_NETWORK_SCRIPT);
1713
            }
1714
            if (get_param_value(down_script, sizeof(down_script), "downscript", p) == 0) {
1715
                pstrcpy(down_script, sizeof(down_script), DEFAULT_NETWORK_DOWN_SCRIPT);
1716
            }
1717
            ret = net_tap_init(vlan, device, name, ifname, setup_script, down_script);
1718
        }
1719
    } else
1720
#endif
1721
    if (!strcmp(device, "socket")) {
1722
        if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
1723
            int fd;
1724
            fd = strtol(buf, NULL, 0);
1725
            ret = -1;
1726
            if (net_socket_fd_init(vlan, device, name, fd, 1))
1727
                ret = 0;
1728
        } else if (get_param_value(buf, sizeof(buf), "listen", p) > 0) {
1729
            ret = net_socket_listen_init(vlan, device, name, buf);
1730
        } else if (get_param_value(buf, sizeof(buf), "connect", p) > 0) {
1731
            ret = net_socket_connect_init(vlan, device, name, buf);
1732
        } else if (get_param_value(buf, sizeof(buf), "mcast", p) > 0) {
1733
            ret = net_socket_mcast_init(vlan, device, name, buf);
1734
        } else {
1735
            fprintf(stderr, "Unknown socket options: %s\n", p);
1736
            ret = -1;
1737
            goto out;
1738
        }
1739
        vlan->nb_host_devs++;
1740
    } else
1741
#ifdef CONFIG_VDE
1742
    if (!strcmp(device, "vde")) {
1743
        char vde_sock[1024], vde_group[512];
1744
        int vde_port, vde_mode;
1745
        vlan->nb_host_devs++;
1746
        if (get_param_value(vde_sock, sizeof(vde_sock), "sock", p) <= 0) {
1747
            vde_sock[0] = '\0';
1748
        }
1749
        if (get_param_value(buf, sizeof(buf), "port", p) > 0) {
1750
            vde_port = strtol(buf, NULL, 10);
1751
        } else {
1752
            vde_port = 0;
1753
        }
1754
        if (get_param_value(vde_group, sizeof(vde_group), "group", p) <= 0) {
1755
            vde_group[0] = '\0';
1756
        }
1757
        if (get_param_value(buf, sizeof(buf), "mode", p) > 0) {
1758
            vde_mode = strtol(buf, NULL, 8);
1759
        } else {
1760
            vde_mode = 0700;
1761
        }
1762
        ret = net_vde_init(vlan, device, name, vde_sock, vde_port, vde_group, vde_mode);
1763
    } else
1764
#endif
1765
    {
1766
        fprintf(stderr, "Unknown network device: %s\n", device);
1767
        ret = -1;
1768
        goto out;
1769
    }
1770
    if (ret < 0) {
1771
        fprintf(stderr, "Could not initialize device '%s'\n", device);
1772
    }
1773
out:
1774
    if (name)
1775
        free(name);
1776
    return ret;
1777
}
1778

    
1779
void net_client_uninit(NICInfo *nd)
1780
{
1781
    nd->vlan->nb_guest_devs--;
1782
    nb_nics--;
1783
    nd->used = 0;
1784
    free((void *)nd->model);
1785
}
1786

    
1787
static int net_host_check_device(const char *device)
1788
{
1789
    int i;
1790
    const char *valid_param_list[] = { "tap", "socket"
1791
#ifdef CONFIG_SLIRP
1792
                                       ,"user"
1793
#endif
1794
#ifdef CONFIG_VDE
1795
                                       ,"vde"
1796
#endif
1797
    };
1798
    for (i = 0; i < sizeof(valid_param_list) / sizeof(char *); i++) {
1799
        if (!strncmp(valid_param_list[i], device,
1800
                     strlen(valid_param_list[i])))
1801
            return 1;
1802
    }
1803

    
1804
    return 0;
1805
}
1806

    
1807
void net_host_device_add(Monitor *mon, const char *device, const char *opts)
1808
{
1809
    if (!net_host_check_device(device)) {
1810
        monitor_printf(mon, "invalid host network device %s\n", device);
1811
        return;
1812
    }
1813
    net_client_init(device, opts);
1814
}
1815

    
1816
void net_host_device_remove(Monitor *mon, int vlan_id, const char *device)
1817
{
1818
    VLANState *vlan;
1819
    VLANClientState *vc;
1820

    
1821
    vlan = qemu_find_vlan(vlan_id);
1822

    
1823
   for(vc = vlan->first_client; vc != NULL; vc = vc->next)
1824
        if (!strcmp(vc->name, device))
1825
            break;
1826

    
1827
    if (!vc) {
1828
        monitor_printf(mon, "can't find device %s\n", device);
1829
        return;
1830
    }
1831
    qemu_del_vlan_client(vc);
1832
}
1833

    
1834
int net_client_parse(const char *str)
1835
{
1836
    const char *p;
1837
    char *q;
1838
    char device[64];
1839

    
1840
    p = str;
1841
    q = device;
1842
    while (*p != '\0' && *p != ',') {
1843
        if ((q - device) < sizeof(device) - 1)
1844
            *q++ = *p;
1845
        p++;
1846
    }
1847
    *q = '\0';
1848
    if (*p == ',')
1849
        p++;
1850

    
1851
    return net_client_init(device, p);
1852
}
1853

    
1854
void do_info_network(Monitor *mon)
1855
{
1856
    VLANState *vlan;
1857
    VLANClientState *vc;
1858

    
1859
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
1860
        monitor_printf(mon, "VLAN %d devices:\n", vlan->id);
1861
        for(vc = vlan->first_client; vc != NULL; vc = vc->next)
1862
            monitor_printf(mon, "  %s: %s\n", vc->name, vc->info_str);
1863
    }
1864
}
1865

    
1866
int do_set_link(Monitor *mon, const char *name, const char *up_or_down)
1867
{
1868
    VLANState *vlan;
1869
    VLANClientState *vc = NULL;
1870

    
1871
    for (vlan = first_vlan; vlan != NULL; vlan = vlan->next)
1872
        for (vc = vlan->first_client; vc != NULL; vc = vc->next)
1873
            if (strcmp(vc->name, name) == 0)
1874
                goto done;
1875
done:
1876

    
1877
    if (!vc) {
1878
        monitor_printf(mon, "could not find network device '%s'", name);
1879
        return 0;
1880
    }
1881

    
1882
    if (strcmp(up_or_down, "up") == 0)
1883
        vc->link_down = 0;
1884
    else if (strcmp(up_or_down, "down") == 0)
1885
        vc->link_down = 1;
1886
    else
1887
        monitor_printf(mon, "invalid link status '%s'; only 'up' or 'down' "
1888
                       "valid\n", up_or_down);
1889

    
1890
    if (vc->link_status_changed)
1891
        vc->link_status_changed(vc);
1892

    
1893
    return 1;
1894
}
1895

    
1896
void net_cleanup(void)
1897
{
1898
#if !defined(_WIN32)
1899
    VLANState *vlan;
1900

    
1901
    /* close network clients */
1902
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
1903
        VLANClientState *vc;
1904

    
1905
        for(vc = vlan->first_client; vc != NULL; vc = vc->next) {
1906
            if (vc->fd_read == tap_receive) {
1907
                TAPState *s = vc->opaque;
1908

    
1909
                if (s->down_script[0])
1910
                    launch_script(s->down_script, s->down_script_arg, s->fd);
1911
            }
1912
#if defined(CONFIG_VDE)
1913
            if (vc->fd_read == vde_from_qemu) {
1914
                VDEState *s = vc->opaque;
1915
                vde_close(s->vde);
1916
            }
1917
#endif
1918
        }
1919
    }
1920
#endif
1921
}
1922

    
1923
void net_client_check(void)
1924
{
1925
    VLANState *vlan;
1926

    
1927
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
1928
        if (vlan->nb_guest_devs == 0 && vlan->nb_host_devs == 0)
1929
            continue;
1930
        if (vlan->nb_guest_devs == 0)
1931
            fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id);
1932
        if (vlan->nb_host_devs == 0)
1933
            fprintf(stderr,
1934
                    "Warning: vlan %d is not connected to host network\n",
1935
                    vlan->id);
1936
    }
1937
}