Statistics
| Branch: | Revision:

root / net.c @ bb6e6364

History | View | Annotate | Download (90.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 <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 CONFIG_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 "tap-linux.h"
50
#endif
51
#include <arpa/inet.h>
52
#include <dirent.h>
53
#include <netdb.h>
54
#include <sys/select.h>
55
#ifdef CONFIG_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
#include "qemu-common.h"
105
#include "net.h"
106
#include "monitor.h"
107
#include "sysemu.h"
108
#include "qemu-timer.h"
109
#include "qemu-char.h"
110
#include "audio/audio.h"
111
#include "qemu_socket.h"
112
#include "qemu-log.h"
113
#include "qemu-config.h"
114

    
115
#include "slirp/libslirp.h"
116

    
117
static QTAILQ_HEAD(, VLANState) vlans;
118
static QTAILQ_HEAD(, VLANClientState) non_vlan_clients;
119

    
120
/***********************************************************/
121
/* network device redirectors */
122

    
123
#if defined(DEBUG_NET) || defined(DEBUG_SLIRP)
124
static void hex_dump(FILE *f, const uint8_t *buf, int size)
125
{
126
    int len, i, j, c;
127

    
128
    for(i=0;i<size;i+=16) {
129
        len = size - i;
130
        if (len > 16)
131
            len = 16;
132
        fprintf(f, "%08x ", i);
133
        for(j=0;j<16;j++) {
134
            if (j < len)
135
                fprintf(f, " %02x", buf[i+j]);
136
            else
137
                fprintf(f, "   ");
138
        }
139
        fprintf(f, " ");
140
        for(j=0;j<len;j++) {
141
            c = buf[i+j];
142
            if (c < ' ' || c > '~')
143
                c = '.';
144
            fprintf(f, "%c", c);
145
        }
146
        fprintf(f, "\n");
147
    }
148
}
149
#endif
150

    
151
static int parse_macaddr(uint8_t *macaddr, const char *p)
152
{
153
    int i;
154
    char *last_char;
155
    long int offset;
156

    
157
    errno = 0;
158
    offset = strtol(p, &last_char, 0);    
159
    if (0 == errno && '\0' == *last_char &&
160
            offset >= 0 && offset <= 0xFFFFFF) {
161
        macaddr[3] = (offset & 0xFF0000) >> 16;
162
        macaddr[4] = (offset & 0xFF00) >> 8;
163
        macaddr[5] = offset & 0xFF;
164
        return 0;
165
    } else {
166
        for(i = 0; i < 6; i++) {
167
            macaddr[i] = strtol(p, (char **)&p, 16);
168
            if (i == 5) {
169
                if (*p != '\0')
170
                    return -1;
171
            } else {
172
                if (*p != ':' && *p != '-')
173
                    return -1;
174
                p++;
175
            }
176
        }
177
        return 0;    
178
    }
179

    
180
    return -1;
181
}
182

    
183
static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
184
{
185
    const char *p, *p1;
186
    int len;
187
    p = *pp;
188
    p1 = strchr(p, sep);
189
    if (!p1)
190
        return -1;
191
    len = p1 - p;
192
    p1++;
193
    if (buf_size > 0) {
194
        if (len > buf_size - 1)
195
            len = buf_size - 1;
196
        memcpy(buf, p, len);
197
        buf[len] = '\0';
198
    }
199
    *pp = p1;
200
    return 0;
201
}
202

    
203
int parse_host_src_port(struct sockaddr_in *haddr,
204
                        struct sockaddr_in *saddr,
205
                        const char *input_str)
206
{
207
    char *str = strdup(input_str);
208
    char *host_str = str;
209
    char *src_str;
210
    const char *src_str2;
211
    char *ptr;
212

    
213
    /*
214
     * Chop off any extra arguments at the end of the string which
215
     * would start with a comma, then fill in the src port information
216
     * if it was provided else use the "any address" and "any port".
217
     */
218
    if ((ptr = strchr(str,',')))
219
        *ptr = '\0';
220

    
221
    if ((src_str = strchr(input_str,'@'))) {
222
        *src_str = '\0';
223
        src_str++;
224
    }
225

    
226
    if (parse_host_port(haddr, host_str) < 0)
227
        goto fail;
228

    
229
    src_str2 = src_str;
230
    if (!src_str || *src_str == '\0')
231
        src_str2 = ":0";
232

    
233
    if (parse_host_port(saddr, src_str2) < 0)
234
        goto fail;
235

    
236
    free(str);
237
    return(0);
238

    
239
fail:
240
    free(str);
241
    return -1;
242
}
243

    
244
int parse_host_port(struct sockaddr_in *saddr, const char *str)
245
{
246
    char buf[512];
247
    struct hostent *he;
248
    const char *p, *r;
249
    int port;
250

    
251
    p = str;
252
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
253
        return -1;
254
    saddr->sin_family = AF_INET;
255
    if (buf[0] == '\0') {
256
        saddr->sin_addr.s_addr = 0;
257
    } else {
258
        if (qemu_isdigit(buf[0])) {
259
            if (!inet_aton(buf, &saddr->sin_addr))
260
                return -1;
261
        } else {
262
            if ((he = gethostbyname(buf)) == NULL)
263
                return - 1;
264
            saddr->sin_addr = *(struct in_addr *)he->h_addr;
265
        }
266
    }
267
    port = strtol(p, (char **)&r, 0);
268
    if (r == p)
269
        return -1;
270
    saddr->sin_port = htons(port);
271
    return 0;
272
}
273

    
274
void qemu_format_nic_info_str(VLANClientState *vc, uint8_t macaddr[6])
275
{
276
    snprintf(vc->info_str, sizeof(vc->info_str),
277
             "model=%s,macaddr=%02x:%02x:%02x:%02x:%02x:%02x",
278
             vc->model,
279
             macaddr[0], macaddr[1], macaddr[2],
280
             macaddr[3], macaddr[4], macaddr[5]);
281
}
282

    
283
void qemu_macaddr_default_if_unset(MACAddr *macaddr)
284
{
285
    static int index = 0;
286
    static const MACAddr zero = { .a = { 0,0,0,0,0,0 } };
287

    
288
    if (memcmp(macaddr, &zero, sizeof(zero)) != 0)
289
        return;
290
    macaddr->a[0] = 0x52;
291
    macaddr->a[1] = 0x54;
292
    macaddr->a[2] = 0x00;
293
    macaddr->a[3] = 0x12;
294
    macaddr->a[4] = 0x34;
295
    macaddr->a[5] = 0x56 + index++;
296
}
297

    
298
static char *assign_name(VLANClientState *vc1, const char *model)
299
{
300
    VLANState *vlan;
301
    char buf[256];
302
    int id = 0;
303

    
304
    QTAILQ_FOREACH(vlan, &vlans, next) {
305
        VLANClientState *vc;
306

    
307
        QTAILQ_FOREACH(vc, &vlan->clients, next) {
308
            if (vc != vc1 && strcmp(vc->model, model) == 0) {
309
                id++;
310
            }
311
        }
312
    }
313

    
314
    snprintf(buf, sizeof(buf), "%s.%d", model, id);
315

    
316
    return qemu_strdup(buf);
317
}
318

    
319
static ssize_t qemu_deliver_packet(VLANClientState *sender,
320
                                   const uint8_t *data,
321
                                   size_t size,
322
                                   void *opaque);
323
static ssize_t qemu_deliver_packet_iov(VLANClientState *sender,
324
                                       const struct iovec *iov,
325
                                       int iovcnt,
326
                                       void *opaque);
327

    
328
VLANClientState *qemu_new_vlan_client(net_client_type type,
329
                                      VLANState *vlan,
330
                                      VLANClientState *peer,
331
                                      const char *model,
332
                                      const char *name,
333
                                      NetCanReceive *can_receive,
334
                                      NetReceive *receive,
335
                                      NetReceiveIOV *receive_iov,
336
                                      NetCleanup *cleanup,
337
                                      void *opaque)
338
{
339
    VLANClientState *vc;
340

    
341
    vc = qemu_mallocz(sizeof(VLANClientState));
342

    
343
    vc->type = type;
344
    vc->model = qemu_strdup(model);
345
    if (name)
346
        vc->name = qemu_strdup(name);
347
    else
348
        vc->name = assign_name(vc, model);
349
    vc->can_receive = can_receive;
350
    vc->receive = receive;
351
    vc->receive_iov = receive_iov;
352
    vc->cleanup = cleanup;
353
    vc->opaque = opaque;
354

    
355
    if (vlan) {
356
        assert(!peer);
357
        vc->vlan = vlan;
358
        QTAILQ_INSERT_TAIL(&vc->vlan->clients, vc, next);
359
    } else {
360
        if (peer) {
361
            vc->peer = peer;
362
            peer->peer = vc;
363
        }
364
        QTAILQ_INSERT_TAIL(&non_vlan_clients, vc, next);
365

    
366
        vc->send_queue = qemu_new_net_queue(qemu_deliver_packet,
367
                                            qemu_deliver_packet_iov,
368
                                            vc);
369
    }
370

    
371
    return vc;
372
}
373

    
374
void qemu_del_vlan_client(VLANClientState *vc)
375
{
376
    if (vc->vlan) {
377
        QTAILQ_REMOVE(&vc->vlan->clients, vc, next);
378
    } else {
379
        if (vc->send_queue) {
380
            qemu_del_net_queue(vc->send_queue);
381
        }
382
        QTAILQ_REMOVE(&non_vlan_clients, vc, next);
383
        if (vc->peer) {
384
            vc->peer->peer = NULL;
385
        }
386
    }
387

    
388
    if (vc->cleanup) {
389
        vc->cleanup(vc);
390
    }
391

    
392
    qemu_free(vc->name);
393
    qemu_free(vc->model);
394
    qemu_free(vc);
395
}
396

    
397
VLANClientState *qemu_find_vlan_client(VLANState *vlan, void *opaque)
398
{
399
    VLANClientState *vc;
400

    
401
    QTAILQ_FOREACH(vc, &vlan->clients, next) {
402
        if (vc->opaque == opaque) {
403
            return vc;
404
        }
405
    }
406

    
407
    return NULL;
408
}
409

    
410
static VLANClientState *
411
qemu_find_vlan_client_by_name(Monitor *mon, int vlan_id,
412
                              const char *client_str)
413
{
414
    VLANState *vlan;
415
    VLANClientState *vc;
416

    
417
    vlan = qemu_find_vlan(vlan_id, 0);
418
    if (!vlan) {
419
        monitor_printf(mon, "unknown VLAN %d\n", vlan_id);
420
        return NULL;
421
    }
422

    
423
    QTAILQ_FOREACH(vc, &vlan->clients, next) {
424
        if (!strcmp(vc->name, client_str)) {
425
            break;
426
        }
427
    }
428
    if (!vc) {
429
        monitor_printf(mon, "can't find device %s on VLAN %d\n",
430
                       client_str, vlan_id);
431
    }
432

    
433
    return vc;
434
}
435

    
436
int qemu_can_send_packet(VLANClientState *sender)
437
{
438
    VLANState *vlan = sender->vlan;
439
    VLANClientState *vc;
440

    
441
    if (sender->peer) {
442
        if (!sender->peer->can_receive ||
443
            sender->peer->can_receive(sender->peer)) {
444
            return 1;
445
        } else {
446
            return 0;
447
        }
448
    }
449

    
450
    if (!sender->vlan) {
451
        return 1;
452
    }
453

    
454
    QTAILQ_FOREACH(vc, &vlan->clients, next) {
455
        if (vc == sender) {
456
            continue;
457
        }
458

    
459
        /* no can_receive() handler, they can always receive */
460
        if (!vc->can_receive || vc->can_receive(vc)) {
461
            return 1;
462
        }
463
    }
464
    return 0;
465
}
466

    
467
static ssize_t qemu_deliver_packet(VLANClientState *sender,
468
                                   const uint8_t *data,
469
                                   size_t size,
470
                                   void *opaque)
471
{
472
    VLANClientState *vc = opaque;
473

    
474
    if (vc->link_down) {
475
        return size;
476
    }
477

    
478
    return vc->receive(vc, data, size);
479
}
480

    
481
static ssize_t qemu_vlan_deliver_packet(VLANClientState *sender,
482
                                        const uint8_t *buf,
483
                                        size_t size,
484
                                        void *opaque)
485
{
486
    VLANState *vlan = opaque;
487
    VLANClientState *vc;
488
    int ret = -1;
489

    
490
    QTAILQ_FOREACH(vc, &vlan->clients, next) {
491
        ssize_t len;
492

    
493
        if (vc == sender) {
494
            continue;
495
        }
496

    
497
        if (vc->link_down) {
498
            ret = size;
499
            continue;
500
        }
501

    
502
        len = vc->receive(vc, buf, size);
503

    
504
        ret = (ret >= 0) ? ret : len;
505
    }
506

    
507
    return ret;
508
}
509

    
510
void qemu_purge_queued_packets(VLANClientState *vc)
511
{
512
    NetQueue *queue;
513

    
514
    if (!vc->peer && !vc->vlan) {
515
        return;
516
    }
517

    
518
    if (vc->peer) {
519
        queue = vc->peer->send_queue;
520
    } else {
521
        queue = vc->vlan->send_queue;
522
    }
523

    
524
    qemu_net_queue_purge(queue, vc);
525
}
526

    
527
void qemu_flush_queued_packets(VLANClientState *vc)
528
{
529
    NetQueue *queue;
530

    
531
    if (vc->vlan) {
532
        queue = vc->vlan->send_queue;
533
    } else {
534
        queue = vc->send_queue;
535
    }
536

    
537
    qemu_net_queue_flush(queue);
538
}
539

    
540
ssize_t qemu_send_packet_async(VLANClientState *sender,
541
                               const uint8_t *buf, int size,
542
                               NetPacketSent *sent_cb)
543
{
544
    NetQueue *queue;
545

    
546
#ifdef DEBUG_NET
547
    printf("qemu_send_packet_async:\n");
548
    hex_dump(stdout, buf, size);
549
#endif
550

    
551
    if (sender->link_down || (!sender->peer && !sender->vlan)) {
552
        return size;
553
    }
554

    
555
    if (sender->peer) {
556
        queue = sender->peer->send_queue;
557
    } else {
558
        queue = sender->vlan->send_queue;
559
    }
560

    
561
    return qemu_net_queue_send(queue, sender, buf, size, sent_cb);
562
}
563

    
564
void qemu_send_packet(VLANClientState *vc, const uint8_t *buf, int size)
565
{
566
    qemu_send_packet_async(vc, buf, size, NULL);
567
}
568

    
569
static ssize_t vc_sendv_compat(VLANClientState *vc, const struct iovec *iov,
570
                               int iovcnt)
571
{
572
    uint8_t buffer[4096];
573
    size_t offset = 0;
574
    int i;
575

    
576
    for (i = 0; i < iovcnt; i++) {
577
        size_t len;
578

    
579
        len = MIN(sizeof(buffer) - offset, iov[i].iov_len);
580
        memcpy(buffer + offset, iov[i].iov_base, len);
581
        offset += len;
582
    }
583

    
584
    return vc->receive(vc, buffer, offset);
585
}
586

    
587
static ssize_t calc_iov_length(const struct iovec *iov, int iovcnt)
588
{
589
    size_t offset = 0;
590
    int i;
591

    
592
    for (i = 0; i < iovcnt; i++)
593
        offset += iov[i].iov_len;
594
    return offset;
595
}
596

    
597
static ssize_t qemu_deliver_packet_iov(VLANClientState *sender,
598
                                       const struct iovec *iov,
599
                                       int iovcnt,
600
                                       void *opaque)
601
{
602
    VLANClientState *vc = opaque;
603

    
604
    if (vc->link_down) {
605
        return calc_iov_length(iov, iovcnt);
606
    }
607

    
608
    if (vc->receive_iov) {
609
        return vc->receive_iov(vc, iov, iovcnt);
610
    } else {
611
        return vc_sendv_compat(vc, iov, iovcnt);
612
    }
613
}
614

    
615
static ssize_t qemu_vlan_deliver_packet_iov(VLANClientState *sender,
616
                                            const struct iovec *iov,
617
                                            int iovcnt,
618
                                            void *opaque)
619
{
620
    VLANState *vlan = opaque;
621
    VLANClientState *vc;
622
    ssize_t ret = -1;
623

    
624
    QTAILQ_FOREACH(vc, &vlan->clients, next) {
625
        ssize_t len;
626

    
627
        if (vc == sender) {
628
            continue;
629
        }
630

    
631
        if (vc->link_down) {
632
            ret = calc_iov_length(iov, iovcnt);
633
            continue;
634
        }
635

    
636
        if (vc->receive_iov) {
637
            len = vc->receive_iov(vc, iov, iovcnt);
638
        } else {
639
            len = vc_sendv_compat(vc, iov, iovcnt);
640
        }
641

    
642
        ret = (ret >= 0) ? ret : len;
643
    }
644

    
645
    return ret;
646
}
647

    
648
ssize_t qemu_sendv_packet_async(VLANClientState *sender,
649
                                const struct iovec *iov, int iovcnt,
650
                                NetPacketSent *sent_cb)
651
{
652
    NetQueue *queue;
653

    
654
    if (sender->link_down || (!sender->peer && !sender->vlan)) {
655
        return calc_iov_length(iov, iovcnt);
656
    }
657

    
658
    if (sender->peer) {
659
        queue = sender->peer->send_queue;
660
    } else {
661
        queue = sender->vlan->send_queue;
662
    }
663

    
664
    return qemu_net_queue_send_iov(queue, sender, iov, iovcnt, sent_cb);
665
}
666

    
667
ssize_t
668
qemu_sendv_packet(VLANClientState *vc, const struct iovec *iov, int iovcnt)
669
{
670
    return qemu_sendv_packet_async(vc, iov, iovcnt, NULL);
671
}
672

    
673
#if defined(CONFIG_SLIRP)
674

    
675
/* slirp network adapter */
676

    
677
#define SLIRP_CFG_HOSTFWD 1
678
#define SLIRP_CFG_LEGACY  2
679

    
680
struct slirp_config_str {
681
    struct slirp_config_str *next;
682
    int flags;
683
    char str[1024];
684
    int legacy_format;
685
};
686

    
687
typedef struct SlirpState {
688
    QTAILQ_ENTRY(SlirpState) entry;
689
    VLANClientState *vc;
690
    Slirp *slirp;
691
#ifndef _WIN32
692
    char smb_dir[128];
693
#endif
694
} SlirpState;
695

    
696
static struct slirp_config_str *slirp_configs;
697
const char *legacy_tftp_prefix;
698
const char *legacy_bootp_filename;
699
static QTAILQ_HEAD(slirp_stacks, SlirpState) slirp_stacks =
700
    QTAILQ_HEAD_INITIALIZER(slirp_stacks);
701

    
702
static int slirp_hostfwd(SlirpState *s, const char *redir_str,
703
                         int legacy_format);
704
static int slirp_guestfwd(SlirpState *s, const char *config_str,
705
                          int legacy_format);
706

    
707
#ifndef _WIN32
708
static const char *legacy_smb_export;
709

    
710
static int slirp_smb(SlirpState *s, const char *exported_dir,
711
                     struct in_addr vserver_addr);
712
static void slirp_smb_cleanup(SlirpState *s);
713
#else
714
static inline void slirp_smb_cleanup(SlirpState *s) { }
715
#endif
716

    
717
int slirp_can_output(void *opaque)
718
{
719
    SlirpState *s = opaque;
720

    
721
    return qemu_can_send_packet(s->vc);
722
}
723

    
724
void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len)
725
{
726
    SlirpState *s = opaque;
727

    
728
#ifdef DEBUG_SLIRP
729
    printf("slirp output:\n");
730
    hex_dump(stdout, pkt, pkt_len);
731
#endif
732
    qemu_send_packet(s->vc, pkt, pkt_len);
733
}
734

    
735
static ssize_t slirp_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
736
{
737
    SlirpState *s = vc->opaque;
738

    
739
#ifdef DEBUG_SLIRP
740
    printf("slirp input:\n");
741
    hex_dump(stdout, buf, size);
742
#endif
743
    slirp_input(s->slirp, buf, size);
744
    return size;
745
}
746

    
747
static void net_slirp_cleanup(VLANClientState *vc)
748
{
749
    SlirpState *s = vc->opaque;
750

    
751
    slirp_cleanup(s->slirp);
752
    slirp_smb_cleanup(s);
753
    QTAILQ_REMOVE(&slirp_stacks, s, entry);
754
    qemu_free(s);
755
}
756

    
757
static int net_slirp_init(VLANState *vlan, const char *model,
758
                          const char *name, int restricted,
759
                          const char *vnetwork, const char *vhost,
760
                          const char *vhostname, const char *tftp_export,
761
                          const char *bootfile, const char *vdhcp_start,
762
                          const char *vnameserver, const char *smb_export,
763
                          const char *vsmbserver)
764
{
765
    /* default settings according to historic slirp */
766
    struct in_addr net  = { .s_addr = htonl(0x0a000200) }; /* 10.0.2.0 */
767
    struct in_addr mask = { .s_addr = htonl(0xffffff00) }; /* 255.255.255.0 */
768
    struct in_addr host = { .s_addr = htonl(0x0a000202) }; /* 10.0.2.2 */
769
    struct in_addr dhcp = { .s_addr = htonl(0x0a00020f) }; /* 10.0.2.15 */
770
    struct in_addr dns  = { .s_addr = htonl(0x0a000203) }; /* 10.0.2.3 */
771
#ifndef _WIN32
772
    struct in_addr smbsrv = { .s_addr = 0 };
773
#endif
774
    SlirpState *s;
775
    char buf[20];
776
    uint32_t addr;
777
    int shift;
778
    char *end;
779
    struct slirp_config_str *config;
780

    
781
    if (!tftp_export) {
782
        tftp_export = legacy_tftp_prefix;
783
    }
784
    if (!bootfile) {
785
        bootfile = legacy_bootp_filename;
786
    }
787

    
788
    if (vnetwork) {
789
        if (get_str_sep(buf, sizeof(buf), &vnetwork, '/') < 0) {
790
            if (!inet_aton(vnetwork, &net)) {
791
                return -1;
792
            }
793
            addr = ntohl(net.s_addr);
794
            if (!(addr & 0x80000000)) {
795
                mask.s_addr = htonl(0xff000000); /* class A */
796
            } else if ((addr & 0xfff00000) == 0xac100000) {
797
                mask.s_addr = htonl(0xfff00000); /* priv. 172.16.0.0/12 */
798
            } else if ((addr & 0xc0000000) == 0x80000000) {
799
                mask.s_addr = htonl(0xffff0000); /* class B */
800
            } else if ((addr & 0xffff0000) == 0xc0a80000) {
801
                mask.s_addr = htonl(0xffff0000); /* priv. 192.168.0.0/16 */
802
            } else if ((addr & 0xffff0000) == 0xc6120000) {
803
                mask.s_addr = htonl(0xfffe0000); /* tests 198.18.0.0/15 */
804
            } else if ((addr & 0xe0000000) == 0xe0000000) {
805
                mask.s_addr = htonl(0xffffff00); /* class C */
806
            } else {
807
                mask.s_addr = htonl(0xfffffff0); /* multicast/reserved */
808
            }
809
        } else {
810
            if (!inet_aton(buf, &net)) {
811
                return -1;
812
            }
813
            shift = strtol(vnetwork, &end, 10);
814
            if (*end != '\0') {
815
                if (!inet_aton(vnetwork, &mask)) {
816
                    return -1;
817
                }
818
            } else if (shift < 4 || shift > 32) {
819
                return -1;
820
            } else {
821
                mask.s_addr = htonl(0xffffffff << (32 - shift));
822
            }
823
        }
824
        net.s_addr &= mask.s_addr;
825
        host.s_addr = net.s_addr | (htonl(0x0202) & ~mask.s_addr);
826
        dhcp.s_addr = net.s_addr | (htonl(0x020f) & ~mask.s_addr);
827
        dns.s_addr  = net.s_addr | (htonl(0x0203) & ~mask.s_addr);
828
    }
829

    
830
    if (vhost && !inet_aton(vhost, &host)) {
831
        return -1;
832
    }
833
    if ((host.s_addr & mask.s_addr) != net.s_addr) {
834
        return -1;
835
    }
836

    
837
    if (vdhcp_start && !inet_aton(vdhcp_start, &dhcp)) {
838
        return -1;
839
    }
840
    if ((dhcp.s_addr & mask.s_addr) != net.s_addr ||
841
        dhcp.s_addr == host.s_addr || dhcp.s_addr == dns.s_addr) {
842
        return -1;
843
    }
844

    
845
    if (vnameserver && !inet_aton(vnameserver, &dns)) {
846
        return -1;
847
    }
848
    if ((dns.s_addr & mask.s_addr) != net.s_addr ||
849
        dns.s_addr == host.s_addr) {
850
        return -1;
851
    }
852

    
853
#ifndef _WIN32
854
    if (vsmbserver && !inet_aton(vsmbserver, &smbsrv)) {
855
        return -1;
856
    }
857
#endif
858

    
859
    s = qemu_mallocz(sizeof(SlirpState));
860
    s->slirp = slirp_init(restricted, net, mask, host, vhostname,
861
                          tftp_export, bootfile, dhcp, dns, s);
862
    QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry);
863

    
864
    for (config = slirp_configs; config; config = config->next) {
865
        if (config->flags & SLIRP_CFG_HOSTFWD) {
866
            if (slirp_hostfwd(s, config->str,
867
                              config->flags & SLIRP_CFG_LEGACY) < 0)
868
                return -1;
869
        } else {
870
            if (slirp_guestfwd(s, config->str,
871
                               config->flags & SLIRP_CFG_LEGACY) < 0)
872
                return -1;
873
        }
874
    }
875
#ifndef _WIN32
876
    if (!smb_export) {
877
        smb_export = legacy_smb_export;
878
    }
879
    if (smb_export) {
880
        if (slirp_smb(s, smb_export, smbsrv) < 0)
881
            return -1;
882
    }
883
#endif
884

    
885
    s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_SLIRP,
886
                                 vlan, NULL, model, name, NULL,
887
                                 slirp_receive, NULL,
888
                                 net_slirp_cleanup, s);
889
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
890
             "net=%s, restricted=%c", inet_ntoa(net), restricted ? 'y' : 'n');
891
    return 0;
892
}
893

    
894
static SlirpState *slirp_lookup(Monitor *mon, const char *vlan,
895
                                const char *stack)
896
{
897
    VLANClientState *vc;
898

    
899
    if (vlan) {
900
        vc = qemu_find_vlan_client_by_name(mon, strtol(vlan, NULL, 0), stack);
901
        if (!vc) {
902
            return NULL;
903
        }
904
        if (strcmp(vc->model, "user")) {
905
            monitor_printf(mon, "invalid device specified\n");
906
            return NULL;
907
        }
908
        return vc->opaque;
909
    } else {
910
        if (QTAILQ_EMPTY(&slirp_stacks)) {
911
            monitor_printf(mon, "user mode network stack not in use\n");
912
            return NULL;
913
        }
914
        return QTAILQ_FIRST(&slirp_stacks);
915
    }
916
}
917

    
918
void net_slirp_hostfwd_remove(Monitor *mon, const QDict *qdict)
919
{
920
    struct in_addr host_addr = { .s_addr = INADDR_ANY };
921
    int host_port;
922
    char buf[256] = "";
923
    const char *src_str, *p;
924
    SlirpState *s;
925
    int is_udp = 0;
926
    int err;
927
    const char *arg1 = qdict_get_str(qdict, "arg1");
928
    const char *arg2 = qdict_get_try_str(qdict, "arg2");
929
    const char *arg3 = qdict_get_try_str(qdict, "arg3");
930

    
931
    if (arg2) {
932
        s = slirp_lookup(mon, arg1, arg2);
933
        src_str = arg3;
934
    } else {
935
        s = slirp_lookup(mon, NULL, NULL);
936
        src_str = arg1;
937
    }
938
    if (!s) {
939
        return;
940
    }
941

    
942
    if (!src_str || !src_str[0])
943
        goto fail_syntax;
944

    
945
    p = src_str;
946
    get_str_sep(buf, sizeof(buf), &p, ':');
947

    
948
    if (!strcmp(buf, "tcp") || buf[0] == '\0') {
949
        is_udp = 0;
950
    } else if (!strcmp(buf, "udp")) {
951
        is_udp = 1;
952
    } else {
953
        goto fail_syntax;
954
    }
955

    
956
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
957
        goto fail_syntax;
958
    }
959
    if (buf[0] != '\0' && !inet_aton(buf, &host_addr)) {
960
        goto fail_syntax;
961
    }
962

    
963
    host_port = atoi(p);
964

    
965
    err = slirp_remove_hostfwd(QTAILQ_FIRST(&slirp_stacks)->slirp, is_udp,
966
                               host_addr, host_port);
967

    
968
    monitor_printf(mon, "host forwarding rule for %s %s\n", src_str,
969
                   err ? "removed" : "not found");
970
    return;
971

    
972
 fail_syntax:
973
    monitor_printf(mon, "invalid format\n");
974
}
975

    
976
static int slirp_hostfwd(SlirpState *s, const char *redir_str,
977
                         int legacy_format)
978
{
979
    struct in_addr host_addr = { .s_addr = INADDR_ANY };
980
    struct in_addr guest_addr = { .s_addr = 0 };
981
    int host_port, guest_port;
982
    const char *p;
983
    char buf[256];
984
    int is_udp;
985
    char *end;
986

    
987
    p = redir_str;
988
    if (!p || get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
989
        goto fail_syntax;
990
    }
991
    if (!strcmp(buf, "tcp") || buf[0] == '\0') {
992
        is_udp = 0;
993
    } else if (!strcmp(buf, "udp")) {
994
        is_udp = 1;
995
    } else {
996
        goto fail_syntax;
997
    }
998

    
999
    if (!legacy_format) {
1000
        if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1001
            goto fail_syntax;
1002
        }
1003
        if (buf[0] != '\0' && !inet_aton(buf, &host_addr)) {
1004
            goto fail_syntax;
1005
        }
1006
    }
1007

    
1008
    if (get_str_sep(buf, sizeof(buf), &p, legacy_format ? ':' : '-') < 0) {
1009
        goto fail_syntax;
1010
    }
1011
    host_port = strtol(buf, &end, 0);
1012
    if (*end != '\0' || host_port < 1 || host_port > 65535) {
1013
        goto fail_syntax;
1014
    }
1015

    
1016
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1017
        goto fail_syntax;
1018
    }
1019
    if (buf[0] != '\0' && !inet_aton(buf, &guest_addr)) {
1020
        goto fail_syntax;
1021
    }
1022

    
1023
    guest_port = strtol(p, &end, 0);
1024
    if (*end != '\0' || guest_port < 1 || guest_port > 65535) {
1025
        goto fail_syntax;
1026
    }
1027

    
1028
    if (slirp_add_hostfwd(s->slirp, is_udp, host_addr, host_port, guest_addr,
1029
                          guest_port) < 0) {
1030
        qemu_error("could not set up host forwarding rule '%s'\n",
1031
                   redir_str);
1032
        return -1;
1033
    }
1034
    return 0;
1035

    
1036
 fail_syntax:
1037
    qemu_error("invalid host forwarding rule '%s'\n", redir_str);
1038
    return -1;
1039
}
1040

    
1041
void net_slirp_hostfwd_add(Monitor *mon, const QDict *qdict)
1042
{
1043
    const char *redir_str;
1044
    SlirpState *s;
1045
    const char *arg1 = qdict_get_str(qdict, "arg1");
1046
    const char *arg2 = qdict_get_try_str(qdict, "arg2");
1047
    const char *arg3 = qdict_get_try_str(qdict, "arg3");
1048

    
1049
    if (arg2) {
1050
        s = slirp_lookup(mon, arg1, arg2);
1051
        redir_str = arg3;
1052
    } else {
1053
        s = slirp_lookup(mon, NULL, NULL);
1054
        redir_str = arg1;
1055
    }
1056
    if (s) {
1057
        slirp_hostfwd(s, redir_str, 0);
1058
    }
1059

    
1060
}
1061

    
1062
int net_slirp_redir(const char *redir_str)
1063
{
1064
    struct slirp_config_str *config;
1065

    
1066
    if (QTAILQ_EMPTY(&slirp_stacks)) {
1067
        config = qemu_malloc(sizeof(*config));
1068
        pstrcpy(config->str, sizeof(config->str), redir_str);
1069
        config->flags = SLIRP_CFG_HOSTFWD | SLIRP_CFG_LEGACY;
1070
        config->next = slirp_configs;
1071
        slirp_configs = config;
1072
        return 0;
1073
    }
1074

    
1075
    return slirp_hostfwd(QTAILQ_FIRST(&slirp_stacks), redir_str, 1);
1076
}
1077

    
1078
#ifndef _WIN32
1079

    
1080
/* automatic user mode samba server configuration */
1081
static void slirp_smb_cleanup(SlirpState *s)
1082
{
1083
    char cmd[128];
1084

    
1085
    if (s->smb_dir[0] != '\0') {
1086
        snprintf(cmd, sizeof(cmd), "rm -rf %s", s->smb_dir);
1087
        system(cmd);
1088
        s->smb_dir[0] = '\0';
1089
    }
1090
}
1091

    
1092
static int slirp_smb(SlirpState* s, const char *exported_dir,
1093
                     struct in_addr vserver_addr)
1094
{
1095
    static int instance;
1096
    char smb_conf[128];
1097
    char smb_cmdline[128];
1098
    FILE *f;
1099

    
1100
    snprintf(s->smb_dir, sizeof(s->smb_dir), "/tmp/qemu-smb.%ld-%d",
1101
             (long)getpid(), instance++);
1102
    if (mkdir(s->smb_dir, 0700) < 0) {
1103
        qemu_error("could not create samba server dir '%s'\n", s->smb_dir);
1104
        return -1;
1105
    }
1106
    snprintf(smb_conf, sizeof(smb_conf), "%s/%s", s->smb_dir, "smb.conf");
1107

    
1108
    f = fopen(smb_conf, "w");
1109
    if (!f) {
1110
        slirp_smb_cleanup(s);
1111
        qemu_error("could not create samba server configuration file '%s'\n",
1112
                   smb_conf);
1113
        return -1;
1114
    }
1115
    fprintf(f,
1116
            "[global]\n"
1117
            "private dir=%s\n"
1118
            "smb ports=0\n"
1119
            "socket address=127.0.0.1\n"
1120
            "pid directory=%s\n"
1121
            "lock directory=%s\n"
1122
            "log file=%s/log.smbd\n"
1123
            "smb passwd file=%s/smbpasswd\n"
1124
            "security = share\n"
1125
            "[qemu]\n"
1126
            "path=%s\n"
1127
            "read only=no\n"
1128
            "guest ok=yes\n",
1129
            s->smb_dir,
1130
            s->smb_dir,
1131
            s->smb_dir,
1132
            s->smb_dir,
1133
            s->smb_dir,
1134
            exported_dir
1135
            );
1136
    fclose(f);
1137

    
1138
    snprintf(smb_cmdline, sizeof(smb_cmdline), "%s -s %s",
1139
             SMBD_COMMAND, smb_conf);
1140

    
1141
    if (slirp_add_exec(s->slirp, 0, smb_cmdline, &vserver_addr, 139) < 0) {
1142
        slirp_smb_cleanup(s);
1143
        qemu_error("conflicting/invalid smbserver address\n");
1144
        return -1;
1145
    }
1146
    return 0;
1147
}
1148

    
1149
/* automatic user mode samba server configuration (legacy interface) */
1150
int net_slirp_smb(const char *exported_dir)
1151
{
1152
    struct in_addr vserver_addr = { .s_addr = 0 };
1153

    
1154
    if (legacy_smb_export) {
1155
        fprintf(stderr, "-smb given twice\n");
1156
        return -1;
1157
    }
1158
    legacy_smb_export = exported_dir;
1159
    if (!QTAILQ_EMPTY(&slirp_stacks)) {
1160
        return slirp_smb(QTAILQ_FIRST(&slirp_stacks), exported_dir,
1161
                         vserver_addr);
1162
    }
1163
    return 0;
1164
}
1165

    
1166
#endif /* !defined(_WIN32) */
1167

    
1168
struct GuestFwd {
1169
    CharDriverState *hd;
1170
    struct in_addr server;
1171
    int port;
1172
    Slirp *slirp;
1173
};
1174

    
1175
static int guestfwd_can_read(void *opaque)
1176
{
1177
    struct GuestFwd *fwd = opaque;
1178
    return slirp_socket_can_recv(fwd->slirp, fwd->server, fwd->port);
1179
}
1180

    
1181
static void guestfwd_read(void *opaque, const uint8_t *buf, int size)
1182
{
1183
    struct GuestFwd *fwd = opaque;
1184
    slirp_socket_recv(fwd->slirp, fwd->server, fwd->port, buf, size);
1185
}
1186

    
1187
static int slirp_guestfwd(SlirpState *s, const char *config_str,
1188
                          int legacy_format)
1189
{
1190
    struct in_addr server = { .s_addr = 0 };
1191
    struct GuestFwd *fwd;
1192
    const char *p;
1193
    char buf[128];
1194
    char *end;
1195
    int port;
1196

    
1197
    p = config_str;
1198
    if (legacy_format) {
1199
        if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1200
            goto fail_syntax;
1201
        }
1202
    } else {
1203
        if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1204
            goto fail_syntax;
1205
        }
1206
        if (strcmp(buf, "tcp") && buf[0] != '\0') {
1207
            goto fail_syntax;
1208
        }
1209
        if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1210
            goto fail_syntax;
1211
        }
1212
        if (buf[0] != '\0' && !inet_aton(buf, &server)) {
1213
            goto fail_syntax;
1214
        }
1215
        if (get_str_sep(buf, sizeof(buf), &p, '-') < 0) {
1216
            goto fail_syntax;
1217
        }
1218
    }
1219
    port = strtol(buf, &end, 10);
1220
    if (*end != '\0' || port < 1 || port > 65535) {
1221
        goto fail_syntax;
1222
    }
1223

    
1224
    fwd = qemu_malloc(sizeof(struct GuestFwd));
1225
    snprintf(buf, sizeof(buf), "guestfwd.tcp:%d", port);
1226
    fwd->hd = qemu_chr_open(buf, p, NULL);
1227
    if (!fwd->hd) {
1228
        qemu_error("could not open guest forwarding device '%s'\n", buf);
1229
        qemu_free(fwd);
1230
        return -1;
1231
    }
1232

    
1233
    if (slirp_add_exec(s->slirp, 3, fwd->hd, &server, port) < 0) {
1234
        qemu_error("conflicting/invalid host:port in guest forwarding "
1235
                   "rule '%s'\n", config_str);
1236
        qemu_free(fwd);
1237
        return -1;
1238
    }
1239
    fwd->server = server;
1240
    fwd->port = port;
1241
    fwd->slirp = s->slirp;
1242

    
1243
    qemu_chr_add_handlers(fwd->hd, guestfwd_can_read, guestfwd_read,
1244
                          NULL, fwd);
1245
    return 0;
1246

    
1247
 fail_syntax:
1248
    qemu_error("invalid guest forwarding rule '%s'\n", config_str);
1249
    return -1;
1250
}
1251

    
1252
void do_info_usernet(Monitor *mon)
1253
{
1254
    SlirpState *s;
1255

    
1256
    QTAILQ_FOREACH(s, &slirp_stacks, entry) {
1257
        monitor_printf(mon, "VLAN %d (%s):\n", s->vc->vlan->id, s->vc->name);
1258
        slirp_connection_info(s->slirp, mon);
1259
    }
1260
}
1261

    
1262
#endif /* CONFIG_SLIRP */
1263

    
1264
#if !defined(_WIN32)
1265

    
1266
/* Maximum GSO packet size (64k) plus plenty of room for
1267
 * the ethernet and virtio_net headers
1268
 */
1269
#define TAP_BUFSIZE (4096 + 65536)
1270

    
1271
typedef struct TAPState {
1272
    VLANClientState *vc;
1273
    int fd;
1274
    char down_script[1024];
1275
    char down_script_arg[128];
1276
    uint8_t buf[TAP_BUFSIZE];
1277
    unsigned int read_poll : 1;
1278
    unsigned int write_poll : 1;
1279
    unsigned int has_vnet_hdr : 1;
1280
} TAPState;
1281

    
1282
static int launch_script(const char *setup_script, const char *ifname, int fd);
1283

    
1284
static int tap_can_send(void *opaque);
1285
static void tap_send(void *opaque);
1286
static void tap_writable(void *opaque);
1287

    
1288
static void tap_update_fd_handler(TAPState *s)
1289
{
1290
    qemu_set_fd_handler2(s->fd,
1291
                         s->read_poll  ? tap_can_send : NULL,
1292
                         s->read_poll  ? tap_send     : NULL,
1293
                         s->write_poll ? tap_writable : NULL,
1294
                         s);
1295
}
1296

    
1297
static void tap_read_poll(TAPState *s, int enable)
1298
{
1299
    s->read_poll = !!enable;
1300
    tap_update_fd_handler(s);
1301
}
1302

    
1303
static void tap_write_poll(TAPState *s, int enable)
1304
{
1305
    s->write_poll = !!enable;
1306
    tap_update_fd_handler(s);
1307
}
1308

    
1309
static void tap_writable(void *opaque)
1310
{
1311
    TAPState *s = opaque;
1312

    
1313
    tap_write_poll(s, 0);
1314

    
1315
    qemu_flush_queued_packets(s->vc);
1316
}
1317

    
1318
static ssize_t tap_write_packet(TAPState *s, const struct iovec *iov, int iovcnt)
1319
{
1320
    ssize_t len;
1321

    
1322
    do {
1323
        len = writev(s->fd, iov, iovcnt);
1324
    } while (len == -1 && errno == EINTR);
1325

    
1326
    if (len == -1 && errno == EAGAIN) {
1327
        tap_write_poll(s, 1);
1328
        return 0;
1329
    }
1330

    
1331
    return len;
1332
}
1333

    
1334
static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov,
1335
                               int iovcnt)
1336
{
1337
    TAPState *s = vc->opaque;
1338
    const struct iovec *iovp = iov;
1339
    struct iovec iov_copy[iovcnt + 1];
1340
    struct virtio_net_hdr hdr = { 0, };
1341

    
1342
    if (s->has_vnet_hdr) {
1343
        iov_copy[0].iov_base = &hdr;
1344
        iov_copy[0].iov_len =  sizeof(hdr);
1345
        memcpy(&iov_copy[1], iov, iovcnt * sizeof(*iov));
1346
        iovp = iov_copy;
1347
        iovcnt++;
1348
    }
1349

    
1350
    return tap_write_packet(s, iovp, iovcnt);
1351
}
1352

    
1353
static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1354
{
1355
    TAPState *s = vc->opaque;
1356
    struct iovec iov[2];
1357
    int iovcnt = 0;
1358
    struct virtio_net_hdr hdr = { 0, };
1359

    
1360
    if (s->has_vnet_hdr) {
1361
        iov[iovcnt].iov_base = &hdr;
1362
        iov[iovcnt].iov_len  = sizeof(hdr);
1363
        iovcnt++;
1364
    }
1365

    
1366
    iov[iovcnt].iov_base = (char *)buf;
1367
    iov[iovcnt].iov_len  = size;
1368
    iovcnt++;
1369

    
1370
    return tap_write_packet(s, iov, iovcnt);
1371
}
1372

    
1373
static int tap_can_send(void *opaque)
1374
{
1375
    TAPState *s = opaque;
1376

    
1377
    return qemu_can_send_packet(s->vc);
1378
}
1379

    
1380
#ifdef __sun__
1381
static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1382
{
1383
    struct strbuf sbuf;
1384
    int f = 0;
1385

    
1386
    sbuf.maxlen = maxlen;
1387
    sbuf.buf = (char *)buf;
1388

    
1389
    return getmsg(tapfd, NULL, &sbuf, &f) >= 0 ? sbuf.len : -1;
1390
}
1391
#else
1392
static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1393
{
1394
    return read(tapfd, buf, maxlen);
1395
}
1396
#endif
1397

    
1398
static void tap_send_completed(VLANClientState *vc, ssize_t len)
1399
{
1400
    TAPState *s = vc->opaque;
1401
    tap_read_poll(s, 1);
1402
}
1403

    
1404
static void tap_send(void *opaque)
1405
{
1406
    TAPState *s = opaque;
1407
    int size;
1408

    
1409
    do {
1410
        uint8_t *buf = s->buf;
1411

    
1412
        size = tap_read_packet(s->fd, s->buf, sizeof(s->buf));
1413
        if (size <= 0) {
1414
            break;
1415
        }
1416

    
1417
        if (s->has_vnet_hdr) {
1418
            buf  += sizeof(struct virtio_net_hdr);
1419
            size -= sizeof(struct virtio_net_hdr);
1420
        }
1421

    
1422
        size = qemu_send_packet_async(s->vc, buf, size, tap_send_completed);
1423
        if (size == 0) {
1424
            tap_read_poll(s, 0);
1425
        }
1426
    } while (size > 0);
1427
}
1428

    
1429
/* sndbuf should be set to a value lower than the tx queue
1430
 * capacity of any destination network interface.
1431
 * Ethernet NICs generally have txqueuelen=1000, so 1Mb is
1432
 * a good default, given a 1500 byte MTU.
1433
 */
1434
#define TAP_DEFAULT_SNDBUF 1024*1024
1435

    
1436
static int tap_set_sndbuf(TAPState *s, QemuOpts *opts)
1437
{
1438
    int sndbuf;
1439

    
1440
    sndbuf = qemu_opt_get_size(opts, "sndbuf", TAP_DEFAULT_SNDBUF);
1441
    if (!sndbuf) {
1442
        sndbuf = INT_MAX;
1443
    }
1444

    
1445
    if (ioctl(s->fd, TUNSETSNDBUF, &sndbuf) == -1 && qemu_opt_get(opts, "sndbuf")) {
1446
        qemu_error("TUNSETSNDBUF ioctl failed: %s\n", strerror(errno));
1447
        return -1;
1448
    }
1449
    return 0;
1450
}
1451

    
1452
static int tap_probe_vnet_hdr(int fd)
1453
{
1454
    struct ifreq ifr;
1455

    
1456
    if (ioctl(fd, TUNGETIFF, &ifr) != 0) {
1457
        qemu_error("TUNGETIFF ioctl() failed: %s\n", strerror(errno));
1458
        return 0;
1459
    }
1460

    
1461
    return ifr.ifr_flags & IFF_VNET_HDR;
1462
}
1463

    
1464
static void tap_cleanup(VLANClientState *vc)
1465
{
1466
    TAPState *s = vc->opaque;
1467

    
1468
    qemu_purge_queued_packets(vc);
1469

    
1470
    if (s->down_script[0])
1471
        launch_script(s->down_script, s->down_script_arg, s->fd);
1472

    
1473
    tap_read_poll(s, 0);
1474
    tap_write_poll(s, 0);
1475
    close(s->fd);
1476
    qemu_free(s);
1477
}
1478

    
1479
/* fd support */
1480

    
1481
static TAPState *net_tap_fd_init(VLANState *vlan,
1482
                                 const char *model,
1483
                                 const char *name,
1484
                                 int fd,
1485
                                 int vnet_hdr)
1486
{
1487
    TAPState *s;
1488

    
1489
    s = qemu_mallocz(sizeof(TAPState));
1490
    s->fd = fd;
1491
    s->has_vnet_hdr = vnet_hdr != 0;
1492
    s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_TAP,
1493
                                 vlan, NULL, model, name, NULL,
1494
                                 tap_receive, tap_receive_iov,
1495
                                 tap_cleanup, s);
1496
    tap_read_poll(s, 1);
1497
    return s;
1498
}
1499

    
1500
#if defined (CONFIG_BSD) || defined (__FreeBSD_kernel__)
1501
static int tap_open(char *ifname, int ifname_size,
1502
                    int *vnet_hdr, int vnet_hdr_required)
1503
{
1504
    int fd;
1505
    char *dev;
1506
    struct stat s;
1507

    
1508
    TFR(fd = open("/dev/tap", O_RDWR));
1509
    if (fd < 0) {
1510
        fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
1511
        return -1;
1512
    }
1513

    
1514
    fstat(fd, &s);
1515
    dev = devname(s.st_rdev, S_IFCHR);
1516
    pstrcpy(ifname, ifname_size, dev);
1517

    
1518
    fcntl(fd, F_SETFL, O_NONBLOCK);
1519
    return fd;
1520
}
1521
#elif defined(__sun__)
1522
#define TUNNEWPPA       (('T'<<16) | 0x0001)
1523
/*
1524
 * Allocate TAP device, returns opened fd.
1525
 * Stores dev name in the first arg(must be large enough).
1526
 */
1527
static int tap_alloc(char *dev, size_t dev_size)
1528
{
1529
    int tap_fd, if_fd, ppa = -1;
1530
    static int ip_fd = 0;
1531
    char *ptr;
1532

    
1533
    static int arp_fd = 0;
1534
    int ip_muxid, arp_muxid;
1535
    struct strioctl  strioc_if, strioc_ppa;
1536
    int link_type = I_PLINK;;
1537
    struct lifreq ifr;
1538
    char actual_name[32] = "";
1539

    
1540
    memset(&ifr, 0x0, sizeof(ifr));
1541

    
1542
    if( *dev ){
1543
       ptr = dev;
1544
       while( *ptr && !qemu_isdigit((int)*ptr) ) ptr++;
1545
       ppa = atoi(ptr);
1546
    }
1547

    
1548
    /* Check if IP device was opened */
1549
    if( ip_fd )
1550
       close(ip_fd);
1551

    
1552
    TFR(ip_fd = open("/dev/udp", O_RDWR, 0));
1553
    if (ip_fd < 0) {
1554
       syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)");
1555
       return -1;
1556
    }
1557

    
1558
    TFR(tap_fd = open("/dev/tap", O_RDWR, 0));
1559
    if (tap_fd < 0) {
1560
       syslog(LOG_ERR, "Can't open /dev/tap");
1561
       return -1;
1562
    }
1563

    
1564
    /* Assign a new PPA and get its unit number. */
1565
    strioc_ppa.ic_cmd = TUNNEWPPA;
1566
    strioc_ppa.ic_timout = 0;
1567
    strioc_ppa.ic_len = sizeof(ppa);
1568
    strioc_ppa.ic_dp = (char *)&ppa;
1569
    if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0)
1570
       syslog (LOG_ERR, "Can't assign new interface");
1571

    
1572
    TFR(if_fd = open("/dev/tap", O_RDWR, 0));
1573
    if (if_fd < 0) {
1574
       syslog(LOG_ERR, "Can't open /dev/tap (2)");
1575
       return -1;
1576
    }
1577
    if(ioctl(if_fd, I_PUSH, "ip") < 0){
1578
       syslog(LOG_ERR, "Can't push IP module");
1579
       return -1;
1580
    }
1581

    
1582
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) < 0)
1583
        syslog(LOG_ERR, "Can't get flags\n");
1584

    
1585
    snprintf (actual_name, 32, "tap%d", ppa);
1586
    pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
1587

    
1588
    ifr.lifr_ppa = ppa;
1589
    /* Assign ppa according to the unit number returned by tun device */
1590

    
1591
    if (ioctl (if_fd, SIOCSLIFNAME, &ifr) < 0)
1592
        syslog (LOG_ERR, "Can't set PPA %d", ppa);
1593
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) <0)
1594
        syslog (LOG_ERR, "Can't get flags\n");
1595
    /* Push arp module to if_fd */
1596
    if (ioctl (if_fd, I_PUSH, "arp") < 0)
1597
        syslog (LOG_ERR, "Can't push ARP module (2)");
1598

    
1599
    /* Push arp module to ip_fd */
1600
    if (ioctl (ip_fd, I_POP, NULL) < 0)
1601
        syslog (LOG_ERR, "I_POP failed\n");
1602
    if (ioctl (ip_fd, I_PUSH, "arp") < 0)
1603
        syslog (LOG_ERR, "Can't push ARP module (3)\n");
1604
    /* Open arp_fd */
1605
    TFR(arp_fd = open ("/dev/tap", O_RDWR, 0));
1606
    if (arp_fd < 0)
1607
       syslog (LOG_ERR, "Can't open %s\n", "/dev/tap");
1608

    
1609
    /* Set ifname to arp */
1610
    strioc_if.ic_cmd = SIOCSLIFNAME;
1611
    strioc_if.ic_timout = 0;
1612
    strioc_if.ic_len = sizeof(ifr);
1613
    strioc_if.ic_dp = (char *)&ifr;
1614
    if (ioctl(arp_fd, I_STR, &strioc_if) < 0){
1615
        syslog (LOG_ERR, "Can't set ifname to arp\n");
1616
    }
1617

    
1618
    if((ip_muxid = ioctl(ip_fd, I_LINK, if_fd)) < 0){
1619
       syslog(LOG_ERR, "Can't link TAP device to IP");
1620
       return -1;
1621
    }
1622

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

    
1626
    close (if_fd);
1627

    
1628
    memset(&ifr, 0x0, sizeof(ifr));
1629
    pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
1630
    ifr.lifr_ip_muxid  = ip_muxid;
1631
    ifr.lifr_arp_muxid = arp_muxid;
1632

    
1633
    if (ioctl (ip_fd, SIOCSLIFMUXID, &ifr) < 0)
1634
    {
1635
      ioctl (ip_fd, I_PUNLINK , arp_muxid);
1636
      ioctl (ip_fd, I_PUNLINK, ip_muxid);
1637
      syslog (LOG_ERR, "Can't set multiplexor id");
1638
    }
1639

    
1640
    snprintf(dev, dev_size, "tap%d", ppa);
1641
    return tap_fd;
1642
}
1643

    
1644
static int tap_open(char *ifname, int ifname_size,
1645
                    int *vnet_hdr, int vnet_hdr_required)
1646
{
1647
    char  dev[10]="";
1648
    int fd;
1649
    if( (fd = tap_alloc(dev, sizeof(dev))) < 0 ){
1650
       fprintf(stderr, "Cannot allocate TAP device\n");
1651
       return -1;
1652
    }
1653
    pstrcpy(ifname, ifname_size, dev);
1654
    fcntl(fd, F_SETFL, O_NONBLOCK);
1655
    return fd;
1656
}
1657
#elif defined (_AIX)
1658
static int tap_open(char *ifname, int ifname_size,
1659
                    int *vnet_hdr, int vnet_hdr_required)
1660
{
1661
    fprintf (stderr, "no tap on AIX\n");
1662
    return -1;
1663
}
1664
#else
1665
static int tap_open(char *ifname, int ifname_size,
1666
                    int *vnet_hdr, int vnet_hdr_required)
1667
{
1668
    struct ifreq ifr;
1669
    int fd, ret;
1670

    
1671
    TFR(fd = open("/dev/net/tun", O_RDWR));
1672
    if (fd < 0) {
1673
        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
1674
        return -1;
1675
    }
1676
    memset(&ifr, 0, sizeof(ifr));
1677
    ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
1678

    
1679
    if (*vnet_hdr) {
1680
        unsigned int features;
1681

    
1682
        if (ioctl(fd, TUNGETFEATURES, &features) == 0 &&
1683
            features & IFF_VNET_HDR) {
1684
            *vnet_hdr = 1;
1685
            ifr.ifr_flags |= IFF_VNET_HDR;
1686
        }
1687

    
1688
        if (vnet_hdr_required && !*vnet_hdr) {
1689
            qemu_error("vnet_hdr=1 requested, but no kernel "
1690
                       "support for IFF_VNET_HDR available");
1691
            close(fd);
1692
            return -1;
1693
        }
1694
    }
1695

    
1696
    if (ifname[0] != '\0')
1697
        pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
1698
    else
1699
        pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
1700
    ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
1701
    if (ret != 0) {
1702
        fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
1703
        close(fd);
1704
        return -1;
1705
    }
1706
    pstrcpy(ifname, ifname_size, ifr.ifr_name);
1707
    fcntl(fd, F_SETFL, O_NONBLOCK);
1708
    return fd;
1709
}
1710
#endif
1711

    
1712
static int launch_script(const char *setup_script, const char *ifname, int fd)
1713
{
1714
    sigset_t oldmask, mask;
1715
    int pid, status;
1716
    char *args[3];
1717
    char **parg;
1718

    
1719
    sigemptyset(&mask);
1720
    sigaddset(&mask, SIGCHLD);
1721
    sigprocmask(SIG_BLOCK, &mask, &oldmask);
1722

    
1723
    /* try to launch network script */
1724
    pid = fork();
1725
    if (pid == 0) {
1726
        int open_max = sysconf(_SC_OPEN_MAX), i;
1727

    
1728
        for (i = 0; i < open_max; i++) {
1729
            if (i != STDIN_FILENO &&
1730
                i != STDOUT_FILENO &&
1731
                i != STDERR_FILENO &&
1732
                i != fd) {
1733
                close(i);
1734
            }
1735
        }
1736
        parg = args;
1737
        *parg++ = (char *)setup_script;
1738
        *parg++ = (char *)ifname;
1739
        *parg++ = NULL;
1740
        execv(setup_script, args);
1741
        _exit(1);
1742
    } else if (pid > 0) {
1743
        while (waitpid(pid, &status, 0) != pid) {
1744
            /* loop */
1745
        }
1746
        sigprocmask(SIG_SETMASK, &oldmask, NULL);
1747

    
1748
        if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
1749
            return 0;
1750
        }
1751
    }
1752
    fprintf(stderr, "%s: could not launch network script\n", setup_script);
1753
    return -1;
1754
}
1755

    
1756
static int net_tap_init(QemuOpts *opts, int *vnet_hdr)
1757
{
1758
    int fd, vnet_hdr_required;
1759
    char ifname[128] = {0,};
1760
    const char *setup_script;
1761

    
1762
    if (qemu_opt_get(opts, "ifname")) {
1763
        pstrcpy(ifname, sizeof(ifname), qemu_opt_get(opts, "ifname"));
1764
    }
1765

    
1766
    *vnet_hdr = qemu_opt_get_bool(opts, "vnet_hdr", 1);
1767
    if (qemu_opt_get(opts, "vnet_hdr")) {
1768
        vnet_hdr_required = *vnet_hdr;
1769
    } else {
1770
        vnet_hdr_required = 0;
1771
    }
1772

    
1773
    TFR(fd = tap_open(ifname, sizeof(ifname), vnet_hdr, vnet_hdr_required));
1774
    if (fd < 0) {
1775
        return -1;
1776
    }
1777

    
1778
    setup_script = qemu_opt_get(opts, "script");
1779
    if (setup_script &&
1780
        setup_script[0] != '\0' &&
1781
        strcmp(setup_script, "no") != 0 &&
1782
        launch_script(setup_script, ifname, fd)) {
1783
        close(fd);
1784
        return -1;
1785
    }
1786

    
1787
    qemu_opt_set(opts, "ifname", ifname);
1788

    
1789
    return fd;
1790
}
1791

    
1792
#endif /* !_WIN32 */
1793

    
1794
#if defined(CONFIG_VDE)
1795
typedef struct VDEState {
1796
    VLANClientState *vc;
1797
    VDECONN *vde;
1798
} VDEState;
1799

    
1800
static void vde_to_qemu(void *opaque)
1801
{
1802
    VDEState *s = opaque;
1803
    uint8_t buf[4096];
1804
    int size;
1805

    
1806
    size = vde_recv(s->vde, (char *)buf, sizeof(buf), 0);
1807
    if (size > 0) {
1808
        qemu_send_packet(s->vc, buf, size);
1809
    }
1810
}
1811

    
1812
static ssize_t vde_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1813
{
1814
    VDEState *s = vc->opaque;
1815
    ssize_t ret;
1816

    
1817
    do {
1818
      ret = vde_send(s->vde, (const char *)buf, size, 0);
1819
    } while (ret < 0 && errno == EINTR);
1820

    
1821
    return ret;
1822
}
1823

    
1824
static void vde_cleanup(VLANClientState *vc)
1825
{
1826
    VDEState *s = vc->opaque;
1827
    qemu_set_fd_handler(vde_datafd(s->vde), NULL, NULL, NULL);
1828
    vde_close(s->vde);
1829
    qemu_free(s);
1830
}
1831

    
1832
static int net_vde_init(VLANState *vlan, const char *model,
1833
                        const char *name, const char *sock,
1834
                        int port, const char *group, int mode)
1835
{
1836
    VDEState *s;
1837
    char *init_group = (char *)group;
1838
    char *init_sock = (char *)sock;
1839

    
1840
    struct vde_open_args args = {
1841
        .port = port,
1842
        .group = init_group,
1843
        .mode = mode,
1844
    };
1845

    
1846
    s = qemu_mallocz(sizeof(VDEState));
1847
    s->vde = vde_open(init_sock, (char *)"QEMU", &args);
1848
    if (!s->vde){
1849
        free(s);
1850
        return -1;
1851
    }
1852
    s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_VDE,
1853
                                 vlan, NULL, model, name, NULL,
1854
                                 vde_receive, NULL,
1855
                                 vde_cleanup, s);
1856
    qemu_set_fd_handler(vde_datafd(s->vde), vde_to_qemu, NULL, s);
1857
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), "sock=%s,fd=%d",
1858
             sock, vde_datafd(s->vde));
1859
    return 0;
1860
}
1861
#endif
1862

    
1863
/* network connection */
1864
typedef struct NetSocketState {
1865
    VLANClientState *vc;
1866
    int fd;
1867
    int state; /* 0 = getting length, 1 = getting data */
1868
    unsigned int index;
1869
    unsigned int packet_len;
1870
    uint8_t buf[4096];
1871
    struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
1872
} NetSocketState;
1873

    
1874
typedef struct NetSocketListenState {
1875
    VLANState *vlan;
1876
    char *model;
1877
    char *name;
1878
    int fd;
1879
} NetSocketListenState;
1880

    
1881
/* XXX: we consider we can send the whole packet without blocking */
1882
static ssize_t net_socket_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1883
{
1884
    NetSocketState *s = vc->opaque;
1885
    uint32_t len;
1886
    len = htonl(size);
1887

    
1888
    send_all(s->fd, (const uint8_t *)&len, sizeof(len));
1889
    return send_all(s->fd, buf, size);
1890
}
1891

    
1892
static ssize_t net_socket_receive_dgram(VLANClientState *vc, const uint8_t *buf, size_t size)
1893
{
1894
    NetSocketState *s = vc->opaque;
1895

    
1896
    return sendto(s->fd, (const void *)buf, size, 0,
1897
                  (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
1898
}
1899

    
1900
static void net_socket_send(void *opaque)
1901
{
1902
    NetSocketState *s = opaque;
1903
    int size, err;
1904
    unsigned l;
1905
    uint8_t buf1[4096];
1906
    const uint8_t *buf;
1907

    
1908
    size = recv(s->fd, (void *)buf1, sizeof(buf1), 0);
1909
    if (size < 0) {
1910
        err = socket_error();
1911
        if (err != EWOULDBLOCK)
1912
            goto eoc;
1913
    } else if (size == 0) {
1914
        /* end of connection */
1915
    eoc:
1916
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1917
        closesocket(s->fd);
1918
        return;
1919
    }
1920
    buf = buf1;
1921
    while (size > 0) {
1922
        /* reassemble a packet from the network */
1923
        switch(s->state) {
1924
        case 0:
1925
            l = 4 - s->index;
1926
            if (l > size)
1927
                l = size;
1928
            memcpy(s->buf + s->index, buf, l);
1929
            buf += l;
1930
            size -= l;
1931
            s->index += l;
1932
            if (s->index == 4) {
1933
                /* got length */
1934
                s->packet_len = ntohl(*(uint32_t *)s->buf);
1935
                s->index = 0;
1936
                s->state = 1;
1937
            }
1938
            break;
1939
        case 1:
1940
            l = s->packet_len - s->index;
1941
            if (l > size)
1942
                l = size;
1943
            if (s->index + l <= sizeof(s->buf)) {
1944
                memcpy(s->buf + s->index, buf, l);
1945
            } else {
1946
                fprintf(stderr, "serious error: oversized packet received,"
1947
                    "connection terminated.\n");
1948
                s->state = 0;
1949
                goto eoc;
1950
            }
1951

    
1952
            s->index += l;
1953
            buf += l;
1954
            size -= l;
1955
            if (s->index >= s->packet_len) {
1956
                qemu_send_packet(s->vc, s->buf, s->packet_len);
1957
                s->index = 0;
1958
                s->state = 0;
1959
            }
1960
            break;
1961
        }
1962
    }
1963
}
1964

    
1965
static void net_socket_send_dgram(void *opaque)
1966
{
1967
    NetSocketState *s = opaque;
1968
    int size;
1969

    
1970
    size = recv(s->fd, (void *)s->buf, sizeof(s->buf), 0);
1971
    if (size < 0)
1972
        return;
1973
    if (size == 0) {
1974
        /* end of connection */
1975
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1976
        return;
1977
    }
1978
    qemu_send_packet(s->vc, s->buf, size);
1979
}
1980

    
1981
static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
1982
{
1983
    struct ip_mreq imr;
1984
    int fd;
1985
    int val, ret;
1986
    if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
1987
        fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
1988
                inet_ntoa(mcastaddr->sin_addr),
1989
                (int)ntohl(mcastaddr->sin_addr.s_addr));
1990
        return -1;
1991

    
1992
    }
1993
    fd = socket(PF_INET, SOCK_DGRAM, 0);
1994
    if (fd < 0) {
1995
        perror("socket(PF_INET, SOCK_DGRAM)");
1996
        return -1;
1997
    }
1998

    
1999
    val = 1;
2000
    ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
2001
                   (const char *)&val, sizeof(val));
2002
    if (ret < 0) {
2003
        perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
2004
        goto fail;
2005
    }
2006

    
2007
    ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
2008
    if (ret < 0) {
2009
        perror("bind");
2010
        goto fail;
2011
    }
2012

    
2013
    /* Add host to multicast group */
2014
    imr.imr_multiaddr = mcastaddr->sin_addr;
2015
    imr.imr_interface.s_addr = htonl(INADDR_ANY);
2016

    
2017
    ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
2018
                     (const char *)&imr, sizeof(struct ip_mreq));
2019
    if (ret < 0) {
2020
        perror("setsockopt(IP_ADD_MEMBERSHIP)");
2021
        goto fail;
2022
    }
2023

    
2024
    /* Force mcast msgs to loopback (eg. several QEMUs in same host */
2025
    val = 1;
2026
    ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
2027
                   (const char *)&val, sizeof(val));
2028
    if (ret < 0) {
2029
        perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
2030
        goto fail;
2031
    }
2032

    
2033
    socket_set_nonblock(fd);
2034
    return fd;
2035
fail:
2036
    if (fd >= 0)
2037
        closesocket(fd);
2038
    return -1;
2039
}
2040

    
2041
static void net_socket_cleanup(VLANClientState *vc)
2042
{
2043
    NetSocketState *s = vc->opaque;
2044
    qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
2045
    close(s->fd);
2046
    qemu_free(s);
2047
}
2048

    
2049
static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan,
2050
                                                const char *model,
2051
                                                const char *name,
2052
                                                int fd, int is_connected)
2053
{
2054
    struct sockaddr_in saddr;
2055
    int newfd;
2056
    socklen_t saddr_len;
2057
    NetSocketState *s;
2058

    
2059
    /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
2060
     * Because this may be "shared" socket from a "master" process, datagrams would be recv()
2061
     * by ONLY ONE process: we must "clone" this dgram socket --jjo
2062
     */
2063

    
2064
    if (is_connected) {
2065
        if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
2066
            /* must be bound */
2067
            if (saddr.sin_addr.s_addr==0) {
2068
                fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
2069
                        fd);
2070
                return NULL;
2071
            }
2072
            /* clone dgram socket */
2073
            newfd = net_socket_mcast_create(&saddr);
2074
            if (newfd < 0) {
2075
                /* error already reported by net_socket_mcast_create() */
2076
                close(fd);
2077
                return NULL;
2078
            }
2079
            /* clone newfd to fd, close newfd */
2080
            dup2(newfd, fd);
2081
            close(newfd);
2082

    
2083
        } else {
2084
            fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
2085
                    fd, strerror(errno));
2086
            return NULL;
2087
        }
2088
    }
2089

    
2090
    s = qemu_mallocz(sizeof(NetSocketState));
2091
    s->fd = fd;
2092

    
2093
    s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_SOCKET,
2094
                                 vlan, NULL, model, name, NULL,
2095
                                 net_socket_receive_dgram, NULL,
2096
                                 net_socket_cleanup, s);
2097
    qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
2098

    
2099
    /* mcast: save bound address as dst */
2100
    if (is_connected) s->dgram_dst=saddr;
2101

    
2102
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2103
            "socket: fd=%d (%s mcast=%s:%d)",
2104
            fd, is_connected? "cloned" : "",
2105
            inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2106
    return s;
2107
}
2108

    
2109
static void net_socket_connect(void *opaque)
2110
{
2111
    NetSocketState *s = opaque;
2112
    qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
2113
}
2114

    
2115
static NetSocketState *net_socket_fd_init_stream(VLANState *vlan,
2116
                                                 const char *model,
2117
                                                 const char *name,
2118
                                                 int fd, int is_connected)
2119
{
2120
    NetSocketState *s;
2121
    s = qemu_mallocz(sizeof(NetSocketState));
2122
    s->fd = fd;
2123
    s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_SOCKET,
2124
                                 vlan, NULL, model, name, NULL,
2125
                                 net_socket_receive, NULL,
2126
                                 net_socket_cleanup, s);
2127
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2128
             "socket: fd=%d", fd);
2129
    if (is_connected) {
2130
        net_socket_connect(s);
2131
    } else {
2132
        qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
2133
    }
2134
    return s;
2135
}
2136

    
2137
static NetSocketState *net_socket_fd_init(VLANState *vlan,
2138
                                          const char *model, const char *name,
2139
                                          int fd, int is_connected)
2140
{
2141
    int so_type = -1, optlen=sizeof(so_type);
2142

    
2143
    if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type,
2144
        (socklen_t *)&optlen)< 0) {
2145
        fprintf(stderr, "qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n", fd);
2146
        return NULL;
2147
    }
2148
    switch(so_type) {
2149
    case SOCK_DGRAM:
2150
        return net_socket_fd_init_dgram(vlan, model, name, fd, is_connected);
2151
    case SOCK_STREAM:
2152
        return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
2153
    default:
2154
        /* who knows ... this could be a eg. a pty, do warn and continue as stream */
2155
        fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
2156
        return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
2157
    }
2158
    return NULL;
2159
}
2160

    
2161
static void net_socket_accept(void *opaque)
2162
{
2163
    NetSocketListenState *s = opaque;
2164
    NetSocketState *s1;
2165
    struct sockaddr_in saddr;
2166
    socklen_t len;
2167
    int fd;
2168

    
2169
    for(;;) {
2170
        len = sizeof(saddr);
2171
        fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
2172
        if (fd < 0 && errno != EINTR) {
2173
            return;
2174
        } else if (fd >= 0) {
2175
            break;
2176
        }
2177
    }
2178
    s1 = net_socket_fd_init(s->vlan, s->model, s->name, fd, 1);
2179
    if (!s1) {
2180
        closesocket(fd);
2181
    } else {
2182
        snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
2183
                 "socket: connection from %s:%d",
2184
                 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2185
    }
2186
}
2187

    
2188
static int net_socket_listen_init(VLANState *vlan,
2189
                                  const char *model,
2190
                                  const char *name,
2191
                                  const char *host_str)
2192
{
2193
    NetSocketListenState *s;
2194
    int fd, val, ret;
2195
    struct sockaddr_in saddr;
2196

    
2197
    if (parse_host_port(&saddr, host_str) < 0)
2198
        return -1;
2199

    
2200
    s = qemu_mallocz(sizeof(NetSocketListenState));
2201

    
2202
    fd = socket(PF_INET, SOCK_STREAM, 0);
2203
    if (fd < 0) {
2204
        perror("socket");
2205
        return -1;
2206
    }
2207
    socket_set_nonblock(fd);
2208

    
2209
    /* allow fast reuse */
2210
    val = 1;
2211
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
2212

    
2213
    ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2214
    if (ret < 0) {
2215
        perror("bind");
2216
        return -1;
2217
    }
2218
    ret = listen(fd, 0);
2219
    if (ret < 0) {
2220
        perror("listen");
2221
        return -1;
2222
    }
2223
    s->vlan = vlan;
2224
    s->model = qemu_strdup(model);
2225
    s->name = name ? qemu_strdup(name) : NULL;
2226
    s->fd = fd;
2227
    qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
2228
    return 0;
2229
}
2230

    
2231
static int net_socket_connect_init(VLANState *vlan,
2232
                                   const char *model,
2233
                                   const char *name,
2234
                                   const char *host_str)
2235
{
2236
    NetSocketState *s;
2237
    int fd, connected, ret, err;
2238
    struct sockaddr_in saddr;
2239

    
2240
    if (parse_host_port(&saddr, host_str) < 0)
2241
        return -1;
2242

    
2243
    fd = socket(PF_INET, SOCK_STREAM, 0);
2244
    if (fd < 0) {
2245
        perror("socket");
2246
        return -1;
2247
    }
2248
    socket_set_nonblock(fd);
2249

    
2250
    connected = 0;
2251
    for(;;) {
2252
        ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2253
        if (ret < 0) {
2254
            err = socket_error();
2255
            if (err == EINTR || err == EWOULDBLOCK) {
2256
            } else if (err == EINPROGRESS) {
2257
                break;
2258
#ifdef _WIN32
2259
            } else if (err == WSAEALREADY) {
2260
                break;
2261
#endif
2262
            } else {
2263
                perror("connect");
2264
                closesocket(fd);
2265
                return -1;
2266
            }
2267
        } else {
2268
            connected = 1;
2269
            break;
2270
        }
2271
    }
2272
    s = net_socket_fd_init(vlan, model, name, fd, connected);
2273
    if (!s)
2274
        return -1;
2275
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2276
             "socket: connect to %s:%d",
2277
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2278
    return 0;
2279
}
2280

    
2281
static int net_socket_mcast_init(VLANState *vlan,
2282
                                 const char *model,
2283
                                 const char *name,
2284
                                 const char *host_str)
2285
{
2286
    NetSocketState *s;
2287
    int fd;
2288
    struct sockaddr_in saddr;
2289

    
2290
    if (parse_host_port(&saddr, host_str) < 0)
2291
        return -1;
2292

    
2293

    
2294
    fd = net_socket_mcast_create(&saddr);
2295
    if (fd < 0)
2296
        return -1;
2297

    
2298
    s = net_socket_fd_init(vlan, model, name, fd, 0);
2299
    if (!s)
2300
        return -1;
2301

    
2302
    s->dgram_dst = saddr;
2303

    
2304
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2305
             "socket: mcast=%s:%d",
2306
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2307
    return 0;
2308

    
2309
}
2310

    
2311
typedef struct DumpState {
2312
    VLANClientState *pcap_vc;
2313
    int fd;
2314
    int pcap_caplen;
2315
} DumpState;
2316

    
2317
#define PCAP_MAGIC 0xa1b2c3d4
2318

    
2319
struct pcap_file_hdr {
2320
    uint32_t magic;
2321
    uint16_t version_major;
2322
    uint16_t version_minor;
2323
    int32_t thiszone;
2324
    uint32_t sigfigs;
2325
    uint32_t snaplen;
2326
    uint32_t linktype;
2327
};
2328

    
2329
struct pcap_sf_pkthdr {
2330
    struct {
2331
        int32_t tv_sec;
2332
        int32_t tv_usec;
2333
    } ts;
2334
    uint32_t caplen;
2335
    uint32_t len;
2336
};
2337

    
2338
static ssize_t dump_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
2339
{
2340
    DumpState *s = vc->opaque;
2341
    struct pcap_sf_pkthdr hdr;
2342
    int64_t ts;
2343
    int caplen;
2344

    
2345
    /* Early return in case of previous error. */
2346
    if (s->fd < 0) {
2347
        return size;
2348
    }
2349

    
2350
    ts = muldiv64(qemu_get_clock(vm_clock), 1000000, get_ticks_per_sec());
2351
    caplen = size > s->pcap_caplen ? s->pcap_caplen : size;
2352

    
2353
    hdr.ts.tv_sec = ts / 1000000;
2354
    hdr.ts.tv_usec = ts % 1000000;
2355
    hdr.caplen = caplen;
2356
    hdr.len = size;
2357
    if (write(s->fd, &hdr, sizeof(hdr)) != sizeof(hdr) ||
2358
        write(s->fd, buf, caplen) != caplen) {
2359
        qemu_log("-net dump write error - stop dump\n");
2360
        close(s->fd);
2361
        s->fd = -1;
2362
    }
2363

    
2364
    return size;
2365
}
2366

    
2367
static void net_dump_cleanup(VLANClientState *vc)
2368
{
2369
    DumpState *s = vc->opaque;
2370

    
2371
    close(s->fd);
2372
    qemu_free(s);
2373
}
2374

    
2375
static int net_dump_init(VLANState *vlan, const char *device,
2376
                         const char *name, const char *filename, int len)
2377
{
2378
    struct pcap_file_hdr hdr;
2379
    DumpState *s;
2380

    
2381
    s = qemu_malloc(sizeof(DumpState));
2382

    
2383
    s->fd = open(filename, O_CREAT | O_WRONLY | O_BINARY, 0644);
2384
    if (s->fd < 0) {
2385
        qemu_error("-net dump: can't open %s\n", filename);
2386
        return -1;
2387
    }
2388

    
2389
    s->pcap_caplen = len;
2390

    
2391
    hdr.magic = PCAP_MAGIC;
2392
    hdr.version_major = 2;
2393
    hdr.version_minor = 4;
2394
    hdr.thiszone = 0;
2395
    hdr.sigfigs = 0;
2396
    hdr.snaplen = s->pcap_caplen;
2397
    hdr.linktype = 1;
2398

    
2399
    if (write(s->fd, &hdr, sizeof(hdr)) < sizeof(hdr)) {
2400
        qemu_error("-net dump write error: %s\n", strerror(errno));
2401
        close(s->fd);
2402
        qemu_free(s);
2403
        return -1;
2404
    }
2405

    
2406
    s->pcap_vc = qemu_new_vlan_client(NET_CLIENT_TYPE_DUMP,
2407
                                      vlan, NULL, device, name, NULL,
2408
                                      dump_receive, NULL,
2409
                                      net_dump_cleanup, s);
2410
    snprintf(s->pcap_vc->info_str, sizeof(s->pcap_vc->info_str),
2411
             "dump to %s (len=%d)", filename, len);
2412
    return 0;
2413
}
2414

    
2415
/* find or alloc a new VLAN */
2416
VLANState *qemu_find_vlan(int id, int allocate)
2417
{
2418
    VLANState *vlan;
2419

    
2420
    QTAILQ_FOREACH(vlan, &vlans, next) {
2421
        if (vlan->id == id) {
2422
            return vlan;
2423
        }
2424
    }
2425

    
2426
    if (!allocate) {
2427
        return NULL;
2428
    }
2429

    
2430
    vlan = qemu_mallocz(sizeof(VLANState));
2431
    vlan->id = id;
2432
    QTAILQ_INIT(&vlan->clients);
2433

    
2434
    vlan->send_queue = qemu_new_net_queue(qemu_vlan_deliver_packet,
2435
                                          qemu_vlan_deliver_packet_iov,
2436
                                          vlan);
2437

    
2438
    QTAILQ_INSERT_TAIL(&vlans, vlan, next);
2439

    
2440
    return vlan;
2441
}
2442

    
2443
VLANClientState *qemu_find_netdev(const char *id)
2444
{
2445
    VLANClientState *vc;
2446

    
2447
    QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
2448
        if (!strcmp(vc->name, id)) {
2449
            return vc;
2450
        }
2451
    }
2452

    
2453
    return NULL;
2454
}
2455

    
2456
static int nic_get_free_idx(void)
2457
{
2458
    int index;
2459

    
2460
    for (index = 0; index < MAX_NICS; index++)
2461
        if (!nd_table[index].used)
2462
            return index;
2463
    return -1;
2464
}
2465

    
2466
int qemu_show_nic_models(const char *arg, const char *const *models)
2467
{
2468
    int i;
2469

    
2470
    if (!arg || strcmp(arg, "?"))
2471
        return 0;
2472

    
2473
    fprintf(stderr, "qemu: Supported NIC models: ");
2474
    for (i = 0 ; models[i]; i++)
2475
        fprintf(stderr, "%s%c", models[i], models[i+1] ? ',' : '\n');
2476
    return 1;
2477
}
2478

    
2479
void qemu_check_nic_model(NICInfo *nd, const char *model)
2480
{
2481
    const char *models[2];
2482

    
2483
    models[0] = model;
2484
    models[1] = NULL;
2485

    
2486
    if (qemu_show_nic_models(nd->model, models))
2487
        exit(0);
2488
    if (qemu_find_nic_model(nd, models, model) < 0)
2489
        exit(1);
2490
}
2491

    
2492
int qemu_find_nic_model(NICInfo *nd, const char * const *models,
2493
                        const char *default_model)
2494
{
2495
    int i;
2496

    
2497
    if (!nd->model)
2498
        nd->model = qemu_strdup(default_model);
2499

    
2500
    for (i = 0 ; models[i]; i++) {
2501
        if (strcmp(nd->model, models[i]) == 0)
2502
            return i;
2503
    }
2504

    
2505
    qemu_error("qemu: Unsupported NIC model: %s\n", nd->model);
2506
    return -1;
2507
}
2508

    
2509
static int net_handle_fd_param(Monitor *mon, const char *param)
2510
{
2511
    if (!qemu_isdigit(param[0])) {
2512
        int fd;
2513

    
2514
        fd = monitor_get_fd(mon, param);
2515
        if (fd == -1) {
2516
            qemu_error("No file descriptor named %s found", param);
2517
            return -1;
2518
        }
2519

    
2520
        return fd;
2521
    } else {
2522
        return strtol(param, NULL, 0);
2523
    }
2524
}
2525

    
2526
static int net_init_nic(QemuOpts *opts,
2527
                        Monitor *mon,
2528
                        const char *name,
2529
                        VLANState *vlan)
2530
{
2531
    int idx;
2532
    NICInfo *nd;
2533
    const char *netdev;
2534

    
2535
    idx = nic_get_free_idx();
2536
    if (idx == -1 || nb_nics >= MAX_NICS) {
2537
        qemu_error("Too Many NICs\n");
2538
        return -1;
2539
    }
2540

    
2541
    nd = &nd_table[idx];
2542

    
2543
    memset(nd, 0, sizeof(*nd));
2544

    
2545
    if ((netdev = qemu_opt_get(opts, "netdev"))) {
2546
        nd->netdev = qemu_find_netdev(netdev);
2547
        if (!nd->netdev) {
2548
            qemu_error("netdev '%s' not found\n", netdev);
2549
            return -1;
2550
        }
2551
    } else {
2552
        assert(vlan);
2553
        nd->vlan = vlan;
2554
    }
2555
    if (name) {
2556
        nd->name = qemu_strdup(name);
2557
    }
2558
    if (qemu_opt_get(opts, "model")) {
2559
        nd->model = qemu_strdup(qemu_opt_get(opts, "model"));
2560
    }
2561
    if (qemu_opt_get(opts, "addr")) {
2562
        nd->devaddr = qemu_strdup(qemu_opt_get(opts, "addr"));
2563
    }
2564

    
2565
    nd->macaddr[0] = 0x52;
2566
    nd->macaddr[1] = 0x54;
2567
    nd->macaddr[2] = 0x00;
2568
    nd->macaddr[3] = 0x12;
2569
    nd->macaddr[4] = 0x34;
2570
    nd->macaddr[5] = 0x56 + idx;
2571

    
2572
    if (qemu_opt_get(opts, "macaddr") &&
2573
        parse_macaddr(nd->macaddr, qemu_opt_get(opts, "macaddr")) < 0) {
2574
        qemu_error("invalid syntax for ethernet address\n");
2575
        return -1;
2576
    }
2577

    
2578
    nd->nvectors = qemu_opt_get_number(opts, "vectors", NIC_NVECTORS_UNSPECIFIED);
2579
    if (nd->nvectors != NIC_NVECTORS_UNSPECIFIED &&
2580
        (nd->nvectors < 0 || nd->nvectors > 0x7ffffff)) {
2581
        qemu_error("invalid # of vectors: %d\n", nd->nvectors);
2582
        return -1;
2583
    }
2584

    
2585
    nd->used = 1;
2586
    if (vlan) {
2587
        nd->vlan->nb_guest_devs++;
2588
    }
2589
    nb_nics++;
2590

    
2591
    return idx;
2592
}
2593

    
2594
#if defined(CONFIG_SLIRP)
2595
static int net_init_slirp_configs(const char *name, const char *value, void *opaque)
2596
{
2597
    struct slirp_config_str *config;
2598

    
2599
    if (strcmp(name, "hostfwd") != 0 && strcmp(name, "guestfwd") != 0) {
2600
        return 0;
2601
    }
2602

    
2603
    config = qemu_mallocz(sizeof(*config));
2604

    
2605
    pstrcpy(config->str, sizeof(config->str), value);
2606

    
2607
    if (!strcmp(name, "hostfwd")) {
2608
        config->flags = SLIRP_CFG_HOSTFWD;
2609
    }
2610

    
2611
    config->next = slirp_configs;
2612
    slirp_configs = config;
2613

    
2614
    return 0;
2615
}
2616

    
2617
static int net_init_slirp(QemuOpts *opts,
2618
                          Monitor *mon,
2619
                          const char *name,
2620
                          VLANState *vlan)
2621
{
2622
    struct slirp_config_str *config;
2623
    const char *vhost;
2624
    const char *vhostname;
2625
    const char *vdhcp_start;
2626
    const char *vnamesrv;
2627
    const char *tftp_export;
2628
    const char *bootfile;
2629
    const char *smb_export;
2630
    const char *vsmbsrv;
2631
    char *vnet = NULL;
2632
    int restricted = 0;
2633
    int ret;
2634

    
2635
    vhost       = qemu_opt_get(opts, "host");
2636
    vhostname   = qemu_opt_get(opts, "hostname");
2637
    vdhcp_start = qemu_opt_get(opts, "dhcpstart");
2638
    vnamesrv    = qemu_opt_get(opts, "dns");
2639
    tftp_export = qemu_opt_get(opts, "tftp");
2640
    bootfile    = qemu_opt_get(opts, "bootfile");
2641
    smb_export  = qemu_opt_get(opts, "smb");
2642
    vsmbsrv     = qemu_opt_get(opts, "smbserver");
2643

    
2644
    if (qemu_opt_get(opts, "ip")) {
2645
        const char *ip = qemu_opt_get(opts, "ip");
2646
        int l = strlen(ip) + strlen("/24") + 1;
2647

    
2648
        vnet = qemu_malloc(l);
2649

    
2650
        /* emulate legacy ip= parameter */
2651
        pstrcpy(vnet, l, ip);
2652
        pstrcat(vnet, l, "/24");
2653
    }
2654

    
2655
    if (qemu_opt_get(opts, "net")) {
2656
        if (vnet) {
2657
            qemu_free(vnet);
2658
        }
2659
        vnet = qemu_strdup(qemu_opt_get(opts, "net"));
2660
    }
2661

    
2662
    if (qemu_opt_get(opts, "restrict") &&
2663
        qemu_opt_get(opts, "restrict")[0] == 'y') {
2664
        restricted = 1;
2665
    }
2666

    
2667
    qemu_opt_foreach(opts, net_init_slirp_configs, NULL, 0);
2668

    
2669
    ret = net_slirp_init(vlan, "user", name, restricted, vnet, vhost,
2670
                         vhostname, tftp_export, bootfile, vdhcp_start,
2671
                         vnamesrv, smb_export, vsmbsrv);
2672

    
2673
    while (slirp_configs) {
2674
        config = slirp_configs;
2675
        slirp_configs = config->next;
2676
        qemu_free(config);
2677
    }
2678

    
2679
    if (ret != -1 && vlan) {
2680
        vlan->nb_host_devs++;
2681
    }
2682

    
2683
    qemu_free(vnet);
2684

    
2685
    return ret;
2686
}
2687
#endif /* CONFIG_SLIRP */
2688

    
2689
#ifdef _WIN32
2690
static int net_init_tap_win32(QemuOpts *opts,
2691
                              Monitor *mon,
2692
                              const char *name,
2693
                              VLANState *vlan)
2694
{
2695
    const char *ifname;
2696

    
2697
    ifname = qemu_opt_get(opts, "ifname");
2698

    
2699
    if (!ifname) {
2700
        qemu_error("tap: no interface name\n");
2701
        return -1;
2702
    }
2703

    
2704
    if (tap_win32_init(vlan, "tap", name, ifname) == -1) {
2705
        return -1;
2706
    }
2707

    
2708
    if (vlan) {
2709
        vlan->nb_host_devs++;
2710
    }
2711

    
2712
    return 0;
2713
}
2714
#elif !defined(_AIX)
2715
static int net_init_tap(QemuOpts *opts,
2716
                        Monitor *mon,
2717
                        const char *name,
2718
                        VLANState *vlan)
2719
{
2720
    TAPState *s;
2721
    int fd, vnet_hdr;
2722

    
2723
    if (qemu_opt_get(opts, "fd")) {
2724
        if (qemu_opt_get(opts, "ifname") ||
2725
            qemu_opt_get(opts, "script") ||
2726
            qemu_opt_get(opts, "downscript") ||
2727
            qemu_opt_get(opts, "vnet_hdr")) {
2728
            qemu_error("ifname=, script=, downscript= and vnet_hdr= is invalid with fd=\n");
2729
            return -1;
2730
        }
2731

    
2732
        fd = net_handle_fd_param(mon, qemu_opt_get(opts, "fd"));
2733
        if (fd == -1) {
2734
            return -1;
2735
        }
2736

    
2737
        fcntl(fd, F_SETFL, O_NONBLOCK);
2738

    
2739
        vnet_hdr = tap_probe_vnet_hdr(fd);
2740
    } else {
2741
        if (!qemu_opt_get(opts, "script")) {
2742
            qemu_opt_set(opts, "script", DEFAULT_NETWORK_SCRIPT);
2743
        }
2744

    
2745
        if (!qemu_opt_get(opts, "downscript")) {
2746
            qemu_opt_set(opts, "downscript", DEFAULT_NETWORK_DOWN_SCRIPT);
2747
        }
2748

    
2749
        fd = net_tap_init(opts, &vnet_hdr);
2750
    }
2751

    
2752
    s = net_tap_fd_init(vlan, "tap", name, fd, vnet_hdr);
2753
    if (!s) {
2754
        close(fd);
2755
        return -1;
2756
    }
2757

    
2758
    if (tap_set_sndbuf(s, opts) < 0) {
2759
        return -1;
2760
    }
2761

    
2762
    if (qemu_opt_get(opts, "fd")) {
2763
        snprintf(s->vc->info_str, sizeof(s->vc->info_str), "fd=%d", fd);
2764
    } else {
2765
        const char *ifname, *script, *downscript;
2766

    
2767
        ifname     = qemu_opt_get(opts, "ifname");
2768
        script     = qemu_opt_get(opts, "script");
2769
        downscript = qemu_opt_get(opts, "downscript");
2770

    
2771
        snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2772
                 "ifname=%s,script=%s,downscript=%s",
2773
                 ifname, script, downscript);
2774

    
2775
        if (strcmp(downscript, "no") != 0) {
2776
            snprintf(s->down_script, sizeof(s->down_script), "%s", downscript);
2777
            snprintf(s->down_script_arg, sizeof(s->down_script_arg), "%s", ifname);
2778
        }
2779
    }
2780

    
2781
    if (vlan) {
2782
        vlan->nb_host_devs++;
2783
    }
2784

    
2785
    return 0;
2786
}
2787
#endif
2788

    
2789
static int net_init_socket(QemuOpts *opts,
2790
                           Monitor *mon,
2791
                           const char *name,
2792
                           VLANState *vlan)
2793
{
2794
    if (qemu_opt_get(opts, "fd")) {
2795
        int fd;
2796

    
2797
        if (qemu_opt_get(opts, "listen") ||
2798
            qemu_opt_get(opts, "connect") ||
2799
            qemu_opt_get(opts, "mcast")) {
2800
            qemu_error("listen=, connect= and mcast= is invalid with fd=\n");
2801
            return -1;
2802
        }
2803

    
2804
        fd = net_handle_fd_param(mon, qemu_opt_get(opts, "fd"));
2805
        if (fd == -1) {
2806
            return -1;
2807
        }
2808

    
2809
        if (!net_socket_fd_init(vlan, "socket", name, fd, 1)) {
2810
            close(fd);
2811
            return -1;
2812
        }
2813
    } else if (qemu_opt_get(opts, "listen")) {
2814
        const char *listen;
2815

    
2816
        if (qemu_opt_get(opts, "fd") ||
2817
            qemu_opt_get(opts, "connect") ||
2818
            qemu_opt_get(opts, "mcast")) {
2819
            qemu_error("fd=, connect= and mcast= is invalid with listen=\n");
2820
            return -1;
2821
        }
2822

    
2823
        listen = qemu_opt_get(opts, "listen");
2824

    
2825
        if (net_socket_listen_init(vlan, "socket", name, listen) == -1) {
2826
            return -1;
2827
        }
2828
    } else if (qemu_opt_get(opts, "connect")) {
2829
        const char *connect;
2830

    
2831
        if (qemu_opt_get(opts, "fd") ||
2832
            qemu_opt_get(opts, "listen") ||
2833
            qemu_opt_get(opts, "mcast")) {
2834
            qemu_error("fd=, listen= and mcast= is invalid with connect=\n");
2835
            return -1;
2836
        }
2837

    
2838
        connect = qemu_opt_get(opts, "connect");
2839

    
2840
        if (net_socket_connect_init(vlan, "socket", name, connect) == -1) {
2841
            return -1;
2842
        }
2843
    } else if (qemu_opt_get(opts, "mcast")) {
2844
        const char *mcast;
2845

    
2846
        if (qemu_opt_get(opts, "fd") ||
2847
            qemu_opt_get(opts, "connect") ||
2848
            qemu_opt_get(opts, "listen")) {
2849
            qemu_error("fd=, connect= and listen= is invalid with mcast=\n");
2850
            return -1;
2851
        }
2852

    
2853
        mcast = qemu_opt_get(opts, "mcast");
2854

    
2855
        if (net_socket_mcast_init(vlan, "socket", name, mcast) == -1) {
2856
            return -1;
2857
        }
2858
    } else {
2859
        qemu_error("-socket requires fd=, listen=, connect= or mcast=\n");
2860
        return -1;
2861
    }
2862

    
2863
    if (vlan) {
2864
        vlan->nb_host_devs++;
2865
    }
2866

    
2867
    return 0;
2868
}
2869

    
2870
#ifdef CONFIG_VDE
2871
static int net_init_vde(QemuOpts *opts,
2872
                        Monitor *mon,
2873
                        const char *name,
2874
                        VLANState *vlan)
2875
{
2876
    const char *sock;
2877
    const char *group;
2878
    int port, mode;
2879

    
2880
    sock  = qemu_opt_get(opts, "sock");
2881
    group = qemu_opt_get(opts, "group");
2882

    
2883
    port = qemu_opt_get_number(opts, "port", 0);
2884
    mode = qemu_opt_get_number(opts, "mode", 0700);
2885

    
2886
    if (net_vde_init(vlan, "vde", name, sock, port, group, mode) == -1) {
2887
        return -1;
2888
    }
2889

    
2890
    if (vlan) {
2891
        vlan->nb_host_devs++;
2892
    }
2893

    
2894
    return 0;
2895
}
2896
#endif
2897

    
2898
static int net_init_dump(QemuOpts *opts,
2899
                         Monitor *mon,
2900
                         const char *name,
2901
                         VLANState *vlan)
2902
{
2903
    int len;
2904
    const char *file;
2905
    char def_file[128];
2906

    
2907
    assert(vlan);
2908

    
2909
    file = qemu_opt_get(opts, "file");
2910
    if (!file) {
2911
        snprintf(def_file, sizeof(def_file), "qemu-vlan%d.pcap", vlan->id);
2912
        file = def_file;
2913
    }
2914

    
2915
    len = qemu_opt_get_size(opts, "len", 65536);
2916

    
2917
    return net_dump_init(vlan, "dump", name, file, len);
2918
}
2919

    
2920
#define NET_COMMON_PARAMS_DESC                     \
2921
    {                                              \
2922
        .name = "type",                            \
2923
        .type = QEMU_OPT_STRING,                   \
2924
        .help = "net client type (nic, tap etc.)", \
2925
     }, {                                          \
2926
        .name = "vlan",                            \
2927
        .type = QEMU_OPT_NUMBER,                   \
2928
        .help = "vlan number",                     \
2929
     }, {                                          \
2930
        .name = "name",                            \
2931
        .type = QEMU_OPT_STRING,                   \
2932
        .help = "identifier for monitor commands", \
2933
     }
2934

    
2935
typedef int (*net_client_init_func)(QemuOpts *opts,
2936
                                    Monitor *mon,
2937
                                    const char *name,
2938
                                    VLANState *vlan);
2939

    
2940
/* magic number, but compiler will warn if too small */
2941
#define NET_MAX_DESC 20
2942

    
2943
static struct {
2944
    const char *type;
2945
    net_client_init_func init;
2946
    QemuOptDesc desc[NET_MAX_DESC];
2947
} net_client_types[] = {
2948
    {
2949
        .type = "none",
2950
        .desc = {
2951
            NET_COMMON_PARAMS_DESC,
2952
            { /* end of list */ }
2953
        },
2954
    }, {
2955
        .type = "nic",
2956
        .init = net_init_nic,
2957
        .desc = {
2958
            NET_COMMON_PARAMS_DESC,
2959
            {
2960
                .name = "netdev",
2961
                .type = QEMU_OPT_STRING,
2962
                .help = "id of -netdev to connect to",
2963
            },
2964
            {
2965
                .name = "macaddr",
2966
                .type = QEMU_OPT_STRING,
2967
                .help = "MAC address",
2968
            }, {
2969
                .name = "model",
2970
                .type = QEMU_OPT_STRING,
2971
                .help = "device model (e1000, rtl8139, virtio etc.)",
2972
            }, {
2973
                .name = "addr",
2974
                .type = QEMU_OPT_STRING,
2975
                .help = "PCI device address",
2976
            }, {
2977
                .name = "vectors",
2978
                .type = QEMU_OPT_NUMBER,
2979
                .help = "number of MSI-x vectors, 0 to disable MSI-X",
2980
            },
2981
            { /* end of list */ }
2982
        },
2983
#ifdef CONFIG_SLIRP
2984
    }, {
2985
        .type = "user",
2986
        .init = net_init_slirp,
2987
        .desc = {
2988
            NET_COMMON_PARAMS_DESC,
2989
            {
2990
                .name = "hostname",
2991
                .type = QEMU_OPT_STRING,
2992
                .help = "client hostname reported by the builtin DHCP server",
2993
            }, {
2994
                .name = "restrict",
2995
                .type = QEMU_OPT_STRING,
2996
                .help = "isolate the guest from the host (y|yes|n|no)",
2997
            }, {
2998
                .name = "ip",
2999
                .type = QEMU_OPT_STRING,
3000
                .help = "legacy parameter, use net= instead",
3001
            }, {
3002
                .name = "net",
3003
                .type = QEMU_OPT_STRING,
3004
                .help = "IP address and optional netmask",
3005
            }, {
3006
                .name = "host",
3007
                .type = QEMU_OPT_STRING,
3008
                .help = "guest-visible address of the host",
3009
            }, {
3010
                .name = "tftp",
3011
                .type = QEMU_OPT_STRING,
3012
                .help = "root directory of the built-in TFTP server",
3013
            }, {
3014
                .name = "bootfile",
3015
                .type = QEMU_OPT_STRING,
3016
                .help = "BOOTP filename, for use with tftp=",
3017
            }, {
3018
                .name = "dhcpstart",
3019
                .type = QEMU_OPT_STRING,
3020
                .help = "the first of the 16 IPs the built-in DHCP server can assign",
3021
            }, {
3022
                .name = "dns",
3023
                .type = QEMU_OPT_STRING,
3024
                .help = "guest-visible address of the virtual nameserver",
3025
            }, {
3026
                .name = "smb",
3027
                .type = QEMU_OPT_STRING,
3028
                .help = "root directory of the built-in SMB server",
3029
            }, {
3030
                .name = "smbserver",
3031
                .type = QEMU_OPT_STRING,
3032
                .help = "IP address of the built-in SMB server",
3033
            }, {
3034
                .name = "hostfwd",
3035
                .type = QEMU_OPT_STRING,
3036
                .help = "guest port number to forward incoming TCP or UDP connections",
3037
            }, {
3038
                .name = "guestfwd",
3039
                .type = QEMU_OPT_STRING,
3040
                .help = "IP address and port to forward guest TCP connections",
3041
            },
3042
            { /* end of list */ }
3043
        },
3044
#endif
3045
#ifdef _WIN32
3046
    }, {
3047
        .type = "tap",
3048
        .init = net_init_tap_win32,
3049
        .desc = {
3050
            NET_COMMON_PARAMS_DESC,
3051
            {
3052
                .name = "ifname",
3053
                .type = QEMU_OPT_STRING,
3054
                .help = "interface name",
3055
            },
3056
            { /* end of list */ }
3057
        },
3058
#elif !defined(_AIX)
3059
    }, {
3060
        .type = "tap",
3061
        .init = net_init_tap,
3062
        .desc = {
3063
            NET_COMMON_PARAMS_DESC,
3064
            {
3065
                .name = "fd",
3066
                .type = QEMU_OPT_STRING,
3067
                .help = "file descriptor of an already opened tap",
3068
            }, {
3069
                .name = "ifname",
3070
                .type = QEMU_OPT_STRING,
3071
                .help = "interface name",
3072
            }, {
3073
                .name = "script",
3074
                .type = QEMU_OPT_STRING,
3075
                .help = "script to initialize the interface",
3076
            }, {
3077
                .name = "downscript",
3078
                .type = QEMU_OPT_STRING,
3079
                .help = "script to shut down the interface",
3080
            }, {
3081
                .name = "sndbuf",
3082
                .type = QEMU_OPT_SIZE,
3083
                .help = "send buffer limit"
3084
            }, {
3085
                .name = "vnet_hdr",
3086
                .type = QEMU_OPT_BOOL,
3087
                .help = "enable the IFF_VNET_HDR flag on the tap interface"
3088
            },
3089
            { /* end of list */ }
3090
        },
3091
#endif
3092
    }, {
3093
        .type = "socket",
3094
        .init = net_init_socket,
3095
        .desc = {
3096
            NET_COMMON_PARAMS_DESC,
3097
            {
3098
                .name = "fd",
3099
                .type = QEMU_OPT_STRING,
3100
                .help = "file descriptor of an already opened socket",
3101
            }, {
3102
                .name = "listen",
3103
                .type = QEMU_OPT_STRING,
3104
                .help = "port number, and optional hostname, to listen on",
3105
            }, {
3106
                .name = "connect",
3107
                .type = QEMU_OPT_STRING,
3108
                .help = "port number, and optional hostname, to connect to",
3109
            }, {
3110
                .name = "mcast",
3111
                .type = QEMU_OPT_STRING,
3112
                .help = "UDP multicast address and port number",
3113
            },
3114
            { /* end of list */ }
3115
        },
3116
#ifdef CONFIG_VDE
3117
    }, {
3118
        .type = "vde",
3119
        .init = net_init_vde,
3120
        .desc = {
3121
            NET_COMMON_PARAMS_DESC,
3122
            {
3123
                .name = "sock",
3124
                .type = QEMU_OPT_STRING,
3125
                .help = "socket path",
3126
            }, {
3127
                .name = "port",
3128
                .type = QEMU_OPT_NUMBER,
3129
                .help = "port number",
3130
            }, {
3131
                .name = "group",
3132
                .type = QEMU_OPT_STRING,
3133
                .help = "group owner of socket",
3134
            }, {
3135
                .name = "mode",
3136
                .type = QEMU_OPT_NUMBER,
3137
                .help = "permissions for socket",
3138
            },
3139
            { /* end of list */ }
3140
        },
3141
#endif
3142
    }, {
3143
        .type = "dump",
3144
        .init = net_init_dump,
3145
        .desc = {
3146
            NET_COMMON_PARAMS_DESC,
3147
            {
3148
                .name = "len",
3149
                .type = QEMU_OPT_SIZE,
3150
                .help = "per-packet size limit (64k default)",
3151
            }, {
3152
                .name = "file",
3153
                .type = QEMU_OPT_STRING,
3154
                .help = "dump file path (default is qemu-vlan0.pcap)",
3155
            },
3156
            { /* end of list */ }
3157
        },
3158
    },
3159
    { /* end of list */ }
3160
};
3161

    
3162
int net_client_init(Monitor *mon, QemuOpts *opts, int is_netdev)
3163
{
3164
    const char *name;
3165
    const char *type;
3166
    int i;
3167

    
3168
    type = qemu_opt_get(opts, "type");
3169
    if (!type) {
3170
        qemu_error("No type specified for -net\n");
3171
        return -1;
3172
    }
3173

    
3174
    if (is_netdev) {
3175
        if (strcmp(type, "tap") != 0 &&
3176
#ifdef CONFIG_SLIRP
3177
            strcmp(type, "user") != 0 &&
3178
#endif
3179
#ifdef CONFIG_VDE
3180
            strcmp(type, "vde") != 0 &&
3181
#endif
3182
            strcmp(type, "socket") != 0) {
3183
            qemu_error("The '%s' network backend type is not valid with -netdev\n",
3184
                       type);
3185
            return -1;
3186
        }
3187

    
3188
        if (qemu_opt_get(opts, "vlan")) {
3189
            qemu_error("The 'vlan' parameter is not valid with -netdev\n");
3190
            return -1;
3191
        }
3192
        if (qemu_opt_get(opts, "name")) {
3193
            qemu_error("The 'name' parameter is not valid with -netdev\n");
3194
            return -1;
3195
        }
3196
        if (!qemu_opts_id(opts)) {
3197
            qemu_error("The id= parameter is required with -netdev\n");
3198
            return -1;
3199
        }
3200
    }
3201

    
3202
    name = qemu_opts_id(opts);
3203
    if (!name) {
3204
        name = qemu_opt_get(opts, "name");
3205
    }
3206

    
3207
    for (i = 0; net_client_types[i].type != NULL; i++) {
3208
        if (!strcmp(net_client_types[i].type, type)) {
3209
            VLANState *vlan = NULL;
3210

    
3211
            if (qemu_opts_validate(opts, &net_client_types[i].desc[0]) == -1) {
3212
                return -1;
3213
            }
3214

    
3215
            /* Do not add to a vlan if it's a -netdev or a nic with a
3216
             * netdev= parameter. */
3217
            if (!(is_netdev ||
3218
                  (strcmp(type, "nic") == 0 && qemu_opt_get(opts, "netdev")))) {
3219
                vlan = qemu_find_vlan(qemu_opt_get_number(opts, "vlan", 0), 1);
3220
            }
3221

    
3222
            if (net_client_types[i].init) {
3223
                return net_client_types[i].init(opts, mon, name, vlan);
3224
            } else {
3225
                return 0;
3226
            }
3227
        }
3228
    }
3229

    
3230
    qemu_error("Invalid -net type '%s'\n", type);
3231
    return -1;
3232
}
3233

    
3234
void net_client_uninit(NICInfo *nd)
3235
{
3236
    if (nd->vlan) {
3237
        nd->vlan->nb_guest_devs--;
3238
    }
3239
    nb_nics--;
3240

    
3241
    qemu_free(nd->model);
3242
    qemu_free(nd->name);
3243
    qemu_free(nd->devaddr);
3244

    
3245
    nd->used = 0;
3246
}
3247

    
3248
static int net_host_check_device(const char *device)
3249
{
3250
    int i;
3251
    const char *valid_param_list[] = { "tap", "socket", "dump"
3252
#ifdef CONFIG_SLIRP
3253
                                       ,"user"
3254
#endif
3255
#ifdef CONFIG_VDE
3256
                                       ,"vde"
3257
#endif
3258
    };
3259
    for (i = 0; i < sizeof(valid_param_list) / sizeof(char *); i++) {
3260
        if (!strncmp(valid_param_list[i], device,
3261
                     strlen(valid_param_list[i])))
3262
            return 1;
3263
    }
3264

    
3265
    return 0;
3266
}
3267

    
3268
void net_host_device_add(Monitor *mon, const QDict *qdict)
3269
{
3270
    const char *device = qdict_get_str(qdict, "device");
3271
    const char *opts_str = qdict_get_try_str(qdict, "opts");
3272
    QemuOpts *opts;
3273

    
3274
    if (!net_host_check_device(device)) {
3275
        monitor_printf(mon, "invalid host network device %s\n", device);
3276
        return;
3277
    }
3278

    
3279
    opts = qemu_opts_parse(&qemu_net_opts, opts_str ? opts_str : "", NULL);
3280
    if (!opts) {
3281
        monitor_printf(mon, "parsing network options '%s' failed\n",
3282
                       opts_str ? opts_str : "");
3283
        return;
3284
    }
3285

    
3286
    qemu_opt_set(opts, "type", device);
3287

    
3288
    if (net_client_init(mon, opts, 0) < 0) {
3289
        monitor_printf(mon, "adding host network device %s failed\n", device);
3290
    }
3291
}
3292

    
3293
void net_host_device_remove(Monitor *mon, const QDict *qdict)
3294
{
3295
    VLANClientState *vc;
3296
    int vlan_id = qdict_get_int(qdict, "vlan_id");
3297
    const char *device = qdict_get_str(qdict, "device");
3298

    
3299
    vc = qemu_find_vlan_client_by_name(mon, vlan_id, device);
3300
    if (!vc) {
3301
        return;
3302
    }
3303
    if (!net_host_check_device(vc->model)) {
3304
        monitor_printf(mon, "invalid host network device %s\n", device);
3305
        return;
3306
    }
3307
    qemu_del_vlan_client(vc);
3308
}
3309

    
3310
void net_set_boot_mask(int net_boot_mask)
3311
{
3312
    int i;
3313

    
3314
    /* Only the first four NICs may be bootable */
3315
    net_boot_mask = net_boot_mask & 0xF;
3316

    
3317
    for (i = 0; i < nb_nics; i++) {
3318
        if (net_boot_mask & (1 << i)) {
3319
            nd_table[i].bootable = 1;
3320
            net_boot_mask &= ~(1 << i);
3321
        }
3322
    }
3323

    
3324
    if (net_boot_mask) {
3325
        fprintf(stderr, "Cannot boot from non-existent NIC\n");
3326
        exit(1);
3327
    }
3328
}
3329

    
3330
void do_info_network(Monitor *mon)
3331
{
3332
    VLANState *vlan;
3333

    
3334
    QTAILQ_FOREACH(vlan, &vlans, next) {
3335
        VLANClientState *vc;
3336

    
3337
        monitor_printf(mon, "VLAN %d devices:\n", vlan->id);
3338

    
3339
        QTAILQ_FOREACH(vc, &vlan->clients, next) {
3340
            monitor_printf(mon, "  %s: %s\n", vc->name, vc->info_str);
3341
        }
3342
    }
3343
}
3344

    
3345
void do_set_link(Monitor *mon, const QDict *qdict)
3346
{
3347
    VLANState *vlan;
3348
    VLANClientState *vc = NULL;
3349
    const char *name = qdict_get_str(qdict, "name");
3350
    const char *up_or_down = qdict_get_str(qdict, "up_or_down");
3351

    
3352
    QTAILQ_FOREACH(vlan, &vlans, next) {
3353
        QTAILQ_FOREACH(vc, &vlan->clients, next) {
3354
            if (strcmp(vc->name, name) == 0) {
3355
                goto done;
3356
            }
3357
        }
3358
    }
3359
done:
3360

    
3361
    if (!vc) {
3362
        monitor_printf(mon, "could not find network device '%s'\n", name);
3363
        return;
3364
    }
3365

    
3366
    if (strcmp(up_or_down, "up") == 0)
3367
        vc->link_down = 0;
3368
    else if (strcmp(up_or_down, "down") == 0)
3369
        vc->link_down = 1;
3370
    else
3371
        monitor_printf(mon, "invalid link status '%s'; only 'up' or 'down' "
3372
                       "valid\n", up_or_down);
3373

    
3374
    if (vc->link_status_changed)
3375
        vc->link_status_changed(vc);
3376
}
3377

    
3378
void net_cleanup(void)
3379
{
3380
    VLANState *vlan;
3381
    VLANClientState *vc, *next_vc;
3382

    
3383
    QTAILQ_FOREACH(vlan, &vlans, next) {
3384
        QTAILQ_FOREACH_SAFE(vc, &vlan->clients, next, next_vc) {
3385
            qemu_del_vlan_client(vc);
3386
        }
3387
    }
3388

    
3389
    QTAILQ_FOREACH_SAFE(vc, &non_vlan_clients, next, next_vc) {
3390
        qemu_del_vlan_client(vc);
3391
    }
3392
}
3393

    
3394
static void net_check_clients(void)
3395
{
3396
    VLANState *vlan;
3397

    
3398
    QTAILQ_FOREACH(vlan, &vlans, next) {
3399
        if (vlan->nb_guest_devs == 0 && vlan->nb_host_devs == 0)
3400
            continue;
3401
        if (vlan->nb_guest_devs == 0)
3402
            fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id);
3403
        if (vlan->nb_host_devs == 0)
3404
            fprintf(stderr,
3405
                    "Warning: vlan %d is not connected to host network\n",
3406
                    vlan->id);
3407
    }
3408
}
3409

    
3410
static int net_init_client(QemuOpts *opts, void *dummy)
3411
{
3412
    if (net_client_init(NULL, opts, 0) < 0)
3413
        return -1;
3414
    return 0;
3415
}
3416

    
3417
static int net_init_netdev(QemuOpts *opts, void *dummy)
3418
{
3419
    return net_client_init(NULL, opts, 1);
3420
}
3421

    
3422
int net_init_clients(void)
3423
{
3424
    if (QTAILQ_EMPTY(&qemu_net_opts.head)) {
3425
        /* if no clients, we use a default config */
3426
        qemu_opts_set(&qemu_net_opts, NULL, "type", "nic");
3427
#ifdef CONFIG_SLIRP
3428
        qemu_opts_set(&qemu_net_opts, NULL, "type", "user");
3429
#endif
3430
    }
3431

    
3432
    QTAILQ_INIT(&vlans);
3433
    QTAILQ_INIT(&non_vlan_clients);
3434

    
3435
    if (qemu_opts_foreach(&qemu_netdev_opts, net_init_netdev, NULL, 1) == -1)
3436
        return -1;
3437

    
3438
    if (qemu_opts_foreach(&qemu_net_opts, net_init_client, NULL, 1) == -1) {
3439
        return -1;
3440
    }
3441

    
3442
    net_check_clients();
3443

    
3444
    return 0;
3445
}
3446

    
3447
int net_client_parse(QemuOptsList *opts_list, const char *optarg)
3448
{
3449
#if defined(CONFIG_SLIRP)
3450
    /* handle legacy -net channel,port:chr */
3451
    if (!strcmp(opts_list->name, "net") &&
3452
        !strncmp(optarg, "channel,", strlen("channel,"))) {
3453
        int ret;
3454

    
3455
        optarg += strlen("channel,");
3456

    
3457
        if (QTAILQ_EMPTY(&slirp_stacks)) {
3458
            struct slirp_config_str *config;
3459

    
3460
            config = qemu_malloc(sizeof(*config));
3461
            pstrcpy(config->str, sizeof(config->str), optarg);
3462
            config->flags = SLIRP_CFG_LEGACY;
3463
            config->next = slirp_configs;
3464
            slirp_configs = config;
3465
            ret = 0;
3466
        } else {
3467
            ret = slirp_guestfwd(QTAILQ_FIRST(&slirp_stacks), optarg, 1);
3468
        }
3469

    
3470
        return ret;
3471
    }
3472
#endif
3473
    if (!qemu_opts_parse(opts_list, optarg, "type")) {
3474
        return -1;
3475
    }
3476

    
3477
    return 0;
3478
}