Statistics
| Branch: | Revision:

root / net.c @ 1eec614b

History | View | Annotate | Download (46.6 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 "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
}