Statistics
| Branch: | Revision:

root / net.c @ 64e58fe5

History | View | Annotate | Download (87.8 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 <linux/if_tun.h>
50
#endif
51
#include <arpa/inet.h>
52
#include <dirent.h>
53
#include <netdb.h>
54
#include <sys/select.h>
55
#ifdef 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(VLANState *vlan,
329
                                      VLANClientState *peer,
330
                                      const char *model,
331
                                      const char *name,
332
                                      NetCanReceive *can_receive,
333
                                      NetReceive *receive,
334
                                      NetReceiveIOV *receive_iov,
335
                                      NetCleanup *cleanup,
336
                                      void *opaque)
337
{
338
    VLANClientState *vc;
339

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

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

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

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

    
369
    return vc;
370
}
371

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

    
386
    if (vc->cleanup) {
387
        vc->cleanup(vc);
388
    }
389

    
390
    qemu_free(vc->name);
391
    qemu_free(vc->model);
392
    qemu_free(vc);
393
}
394

    
395
VLANClientState *qemu_find_vlan_client(VLANState *vlan, void *opaque)
396
{
397
    VLANClientState *vc;
398

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

    
405
    return NULL;
406
}
407

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

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

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

    
431
    return vc;
432
}
433

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

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

    
448
    if (!sender->vlan) {
449
        return 1;
450
    }
451

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

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

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

    
472
    if (vc->link_down) {
473
        return size;
474
    }
475

    
476
    return vc->receive(vc, data, size);
477
}
478

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

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

    
491
        if (vc == sender) {
492
            continue;
493
        }
494

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

    
500
        len = vc->receive(vc, buf, size);
501

    
502
        ret = (ret >= 0) ? ret : len;
503
    }
504

    
505
    return ret;
506
}
507

    
508
void qemu_purge_queued_packets(VLANClientState *vc)
509
{
510
    NetQueue *queue;
511

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

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

    
522
    qemu_net_queue_purge(queue, vc);
523
}
524

    
525
void qemu_flush_queued_packets(VLANClientState *vc)
526
{
527
    NetQueue *queue;
528

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

    
535
    qemu_net_queue_flush(queue);
536
}
537

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

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

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

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

    
559
    return qemu_net_queue_send(queue, sender, buf, size, sent_cb);
560
}
561

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

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

    
574
    for (i = 0; i < iovcnt; i++) {
575
        size_t len;
576

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

    
582
    return vc->receive(vc, buffer, offset);
583
}
584

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

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

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

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

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

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

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

    
625
        if (vc == sender) {
626
            continue;
627
        }
628

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

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

    
640
        ret = (ret >= 0) ? ret : len;
641
    }
642

    
643
    return ret;
644
}
645

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

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

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

    
662
    return qemu_net_queue_send_iov(queue, sender, iov, iovcnt, sent_cb);
663
}
664

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

    
671
#if defined(CONFIG_SLIRP)
672

    
673
/* slirp network adapter */
674

    
675
#define SLIRP_CFG_HOSTFWD 1
676
#define SLIRP_CFG_LEGACY  2
677

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

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

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

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

    
705
#ifndef _WIN32
706
static const char *legacy_smb_export;
707

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

    
715
int slirp_can_output(void *opaque)
716
{
717
    SlirpState *s = opaque;
718

    
719
    return qemu_can_send_packet(s->vc);
720
}
721

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
891
static SlirpState *slirp_lookup(Monitor *mon, const char *vlan,
892
                                const char *stack)
893
{
894
    VLANClientState *vc;
895

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

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

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

    
939
    if (!src_str || !src_str[0])
940
        goto fail_syntax;
941

    
942
    p = src_str;
943
    get_str_sep(buf, sizeof(buf), &p, ':');
944

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

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

    
960
    host_port = atoi(p);
961

    
962
    err = slirp_remove_hostfwd(QTAILQ_FIRST(&slirp_stacks)->slirp, is_udp,
963
                               host_addr, host_port);
964

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

    
969
 fail_syntax:
970
    monitor_printf(mon, "invalid format\n");
971
}
972

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

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

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

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

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

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

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

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

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

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

    
1057
}
1058

    
1059
int net_slirp_redir(const char *redir_str)
1060
{
1061
    struct slirp_config_str *config;
1062

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

    
1072
    return slirp_hostfwd(QTAILQ_FIRST(&slirp_stacks), redir_str, 1);
1073
}
1074

    
1075
#ifndef _WIN32
1076

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

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

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

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

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

    
1135
    snprintf(smb_cmdline, sizeof(smb_cmdline), "%s -s %s",
1136
             SMBD_COMMAND, smb_conf);
1137

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

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

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

    
1163
#endif /* !defined(_WIN32) */
1164

    
1165
struct GuestFwd {
1166
    CharDriverState *hd;
1167
    struct in_addr server;
1168
    int port;
1169
    Slirp *slirp;
1170
};
1171

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

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

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

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

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

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

    
1240
    qemu_chr_add_handlers(fwd->hd, guestfwd_can_read, guestfwd_read,
1241
                          NULL, fwd);
1242
    return 0;
1243

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

    
1249
void do_info_usernet(Monitor *mon)
1250
{
1251
    SlirpState *s;
1252

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

    
1259
#endif /* CONFIG_SLIRP */
1260

    
1261
#if !defined(_WIN32)
1262

    
1263
typedef struct TAPState {
1264
    VLANClientState *vc;
1265
    int fd;
1266
    char down_script[1024];
1267
    char down_script_arg[128];
1268
    uint8_t buf[4096];
1269
    unsigned int read_poll : 1;
1270
    unsigned int write_poll : 1;
1271
} TAPState;
1272

    
1273
static int launch_script(const char *setup_script, const char *ifname, int fd);
1274

    
1275
static int tap_can_send(void *opaque);
1276
static void tap_send(void *opaque);
1277
static void tap_writable(void *opaque);
1278

    
1279
static void tap_update_fd_handler(TAPState *s)
1280
{
1281
    qemu_set_fd_handler2(s->fd,
1282
                         s->read_poll  ? tap_can_send : NULL,
1283
                         s->read_poll  ? tap_send     : NULL,
1284
                         s->write_poll ? tap_writable : NULL,
1285
                         s);
1286
}
1287

    
1288
static void tap_read_poll(TAPState *s, int enable)
1289
{
1290
    s->read_poll = !!enable;
1291
    tap_update_fd_handler(s);
1292
}
1293

    
1294
static void tap_write_poll(TAPState *s, int enable)
1295
{
1296
    s->write_poll = !!enable;
1297
    tap_update_fd_handler(s);
1298
}
1299

    
1300
static void tap_writable(void *opaque)
1301
{
1302
    TAPState *s = opaque;
1303

    
1304
    tap_write_poll(s, 0);
1305

    
1306
    qemu_flush_queued_packets(s->vc);
1307
}
1308

    
1309
static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov,
1310
                               int iovcnt)
1311
{
1312
    TAPState *s = vc->opaque;
1313
    ssize_t len;
1314

    
1315
    do {
1316
        len = writev(s->fd, iov, iovcnt);
1317
    } while (len == -1 && errno == EINTR);
1318

    
1319
    if (len == -1 && errno == EAGAIN) {
1320
        tap_write_poll(s, 1);
1321
        return 0;
1322
    }
1323

    
1324
    return len;
1325
}
1326

    
1327
static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1328
{
1329
    TAPState *s = vc->opaque;
1330
    ssize_t len;
1331

    
1332
    do {
1333
        len = write(s->fd, buf, size);
1334
    } while (len == -1 && (errno == EINTR || errno == EAGAIN));
1335

    
1336
    return len;
1337
}
1338

    
1339
static int tap_can_send(void *opaque)
1340
{
1341
    TAPState *s = opaque;
1342

    
1343
    return qemu_can_send_packet(s->vc);
1344
}
1345

    
1346
#ifdef __sun__
1347
static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1348
{
1349
    struct strbuf sbuf;
1350
    int f = 0;
1351

    
1352
    sbuf.maxlen = maxlen;
1353
    sbuf.buf = (char *)buf;
1354

    
1355
    return getmsg(tapfd, NULL, &sbuf, &f) >= 0 ? sbuf.len : -1;
1356
}
1357
#else
1358
static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1359
{
1360
    return read(tapfd, buf, maxlen);
1361
}
1362
#endif
1363

    
1364
static void tap_send_completed(VLANClientState *vc, ssize_t len)
1365
{
1366
    TAPState *s = vc->opaque;
1367
    tap_read_poll(s, 1);
1368
}
1369

    
1370
static void tap_send(void *opaque)
1371
{
1372
    TAPState *s = opaque;
1373
    int size;
1374

    
1375
    do {
1376
        size = tap_read_packet(s->fd, s->buf, sizeof(s->buf));
1377
        if (size <= 0) {
1378
            break;
1379
        }
1380

    
1381
        size = qemu_send_packet_async(s->vc, s->buf, size, tap_send_completed);
1382
        if (size == 0) {
1383
            tap_read_poll(s, 0);
1384
        }
1385
    } while (size > 0);
1386
}
1387

    
1388
#ifdef TUNSETSNDBUF
1389
/* sndbuf should be set to a value lower than the tx queue
1390
 * capacity of any destination network interface.
1391
 * Ethernet NICs generally have txqueuelen=1000, so 1Mb is
1392
 * a good default, given a 1500 byte MTU.
1393
 */
1394
#define TAP_DEFAULT_SNDBUF 1024*1024
1395

    
1396
static int tap_set_sndbuf(TAPState *s, QemuOpts *opts)
1397
{
1398
    int sndbuf;
1399

    
1400
    sndbuf = qemu_opt_get_size(opts, "sndbuf", TAP_DEFAULT_SNDBUF);
1401
    if (!sndbuf) {
1402
        sndbuf = INT_MAX;
1403
    }
1404

    
1405
    if (ioctl(s->fd, TUNSETSNDBUF, &sndbuf) == -1 && qemu_opt_get(opts, "sndbuf")) {
1406
        qemu_error("TUNSETSNDBUF ioctl failed: %s\n", strerror(errno));
1407
        return -1;
1408
    }
1409
    return 0;
1410
}
1411
#else
1412
static int tap_set_sndbuf(TAPState *s, QemuOpts *opts)
1413
{
1414
    return 0;
1415
}
1416
#endif /* TUNSETSNDBUF */
1417

    
1418
static void tap_cleanup(VLANClientState *vc)
1419
{
1420
    TAPState *s = vc->opaque;
1421

    
1422
    qemu_purge_queued_packets(vc);
1423

    
1424
    if (s->down_script[0])
1425
        launch_script(s->down_script, s->down_script_arg, s->fd);
1426

    
1427
    tap_read_poll(s, 0);
1428
    tap_write_poll(s, 0);
1429
    close(s->fd);
1430
    qemu_free(s);
1431
}
1432

    
1433
/* fd support */
1434

    
1435
static TAPState *net_tap_fd_init(VLANState *vlan,
1436
                                 const char *model,
1437
                                 const char *name,
1438
                                 int fd)
1439
{
1440
    TAPState *s;
1441

    
1442
    s = qemu_mallocz(sizeof(TAPState));
1443
    s->fd = fd;
1444
    s->vc = qemu_new_vlan_client(vlan, NULL, model, name, NULL,
1445
                                 tap_receive, tap_receive_iov,
1446
                                 tap_cleanup, s);
1447
    tap_read_poll(s, 1);
1448
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), "fd=%d", fd);
1449
    return s;
1450
}
1451

    
1452
#if defined (CONFIG_BSD) || defined (__FreeBSD_kernel__)
1453
static int tap_open(char *ifname, int ifname_size)
1454
{
1455
    int fd;
1456
    char *dev;
1457
    struct stat s;
1458

    
1459
    TFR(fd = open("/dev/tap", O_RDWR));
1460
    if (fd < 0) {
1461
        fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
1462
        return -1;
1463
    }
1464

    
1465
    fstat(fd, &s);
1466
    dev = devname(s.st_rdev, S_IFCHR);
1467
    pstrcpy(ifname, ifname_size, dev);
1468

    
1469
    fcntl(fd, F_SETFL, O_NONBLOCK);
1470
    return fd;
1471
}
1472
#elif defined(__sun__)
1473
#define TUNNEWPPA       (('T'<<16) | 0x0001)
1474
/*
1475
 * Allocate TAP device, returns opened fd.
1476
 * Stores dev name in the first arg(must be large enough).
1477
 */
1478
static int tap_alloc(char *dev, size_t dev_size)
1479
{
1480
    int tap_fd, if_fd, ppa = -1;
1481
    static int ip_fd = 0;
1482
    char *ptr;
1483

    
1484
    static int arp_fd = 0;
1485
    int ip_muxid, arp_muxid;
1486
    struct strioctl  strioc_if, strioc_ppa;
1487
    int link_type = I_PLINK;;
1488
    struct lifreq ifr;
1489
    char actual_name[32] = "";
1490

    
1491
    memset(&ifr, 0x0, sizeof(ifr));
1492

    
1493
    if( *dev ){
1494
       ptr = dev;
1495
       while( *ptr && !qemu_isdigit((int)*ptr) ) ptr++;
1496
       ppa = atoi(ptr);
1497
    }
1498

    
1499
    /* Check if IP device was opened */
1500
    if( ip_fd )
1501
       close(ip_fd);
1502

    
1503
    TFR(ip_fd = open("/dev/udp", O_RDWR, 0));
1504
    if (ip_fd < 0) {
1505
       syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)");
1506
       return -1;
1507
    }
1508

    
1509
    TFR(tap_fd = open("/dev/tap", O_RDWR, 0));
1510
    if (tap_fd < 0) {
1511
       syslog(LOG_ERR, "Can't open /dev/tap");
1512
       return -1;
1513
    }
1514

    
1515
    /* Assign a new PPA and get its unit number. */
1516
    strioc_ppa.ic_cmd = TUNNEWPPA;
1517
    strioc_ppa.ic_timout = 0;
1518
    strioc_ppa.ic_len = sizeof(ppa);
1519
    strioc_ppa.ic_dp = (char *)&ppa;
1520
    if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0)
1521
       syslog (LOG_ERR, "Can't assign new interface");
1522

    
1523
    TFR(if_fd = open("/dev/tap", O_RDWR, 0));
1524
    if (if_fd < 0) {
1525
       syslog(LOG_ERR, "Can't open /dev/tap (2)");
1526
       return -1;
1527
    }
1528
    if(ioctl(if_fd, I_PUSH, "ip") < 0){
1529
       syslog(LOG_ERR, "Can't push IP module");
1530
       return -1;
1531
    }
1532

    
1533
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) < 0)
1534
        syslog(LOG_ERR, "Can't get flags\n");
1535

    
1536
    snprintf (actual_name, 32, "tap%d", ppa);
1537
    pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
1538

    
1539
    ifr.lifr_ppa = ppa;
1540
    /* Assign ppa according to the unit number returned by tun device */
1541

    
1542
    if (ioctl (if_fd, SIOCSLIFNAME, &ifr) < 0)
1543
        syslog (LOG_ERR, "Can't set PPA %d", ppa);
1544
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) <0)
1545
        syslog (LOG_ERR, "Can't get flags\n");
1546
    /* Push arp module to if_fd */
1547
    if (ioctl (if_fd, I_PUSH, "arp") < 0)
1548
        syslog (LOG_ERR, "Can't push ARP module (2)");
1549

    
1550
    /* Push arp module to ip_fd */
1551
    if (ioctl (ip_fd, I_POP, NULL) < 0)
1552
        syslog (LOG_ERR, "I_POP failed\n");
1553
    if (ioctl (ip_fd, I_PUSH, "arp") < 0)
1554
        syslog (LOG_ERR, "Can't push ARP module (3)\n");
1555
    /* Open arp_fd */
1556
    TFR(arp_fd = open ("/dev/tap", O_RDWR, 0));
1557
    if (arp_fd < 0)
1558
       syslog (LOG_ERR, "Can't open %s\n", "/dev/tap");
1559

    
1560
    /* Set ifname to arp */
1561
    strioc_if.ic_cmd = SIOCSLIFNAME;
1562
    strioc_if.ic_timout = 0;
1563
    strioc_if.ic_len = sizeof(ifr);
1564
    strioc_if.ic_dp = (char *)&ifr;
1565
    if (ioctl(arp_fd, I_STR, &strioc_if) < 0){
1566
        syslog (LOG_ERR, "Can't set ifname to arp\n");
1567
    }
1568

    
1569
    if((ip_muxid = ioctl(ip_fd, I_LINK, if_fd)) < 0){
1570
       syslog(LOG_ERR, "Can't link TAP device to IP");
1571
       return -1;
1572
    }
1573

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

    
1577
    close (if_fd);
1578

    
1579
    memset(&ifr, 0x0, sizeof(ifr));
1580
    pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
1581
    ifr.lifr_ip_muxid  = ip_muxid;
1582
    ifr.lifr_arp_muxid = arp_muxid;
1583

    
1584
    if (ioctl (ip_fd, SIOCSLIFMUXID, &ifr) < 0)
1585
    {
1586
      ioctl (ip_fd, I_PUNLINK , arp_muxid);
1587
      ioctl (ip_fd, I_PUNLINK, ip_muxid);
1588
      syslog (LOG_ERR, "Can't set multiplexor id");
1589
    }
1590

    
1591
    snprintf(dev, dev_size, "tap%d", ppa);
1592
    return tap_fd;
1593
}
1594

    
1595
static int tap_open(char *ifname, int ifname_size)
1596
{
1597
    char  dev[10]="";
1598
    int fd;
1599
    if( (fd = tap_alloc(dev, sizeof(dev))) < 0 ){
1600
       fprintf(stderr, "Cannot allocate TAP device\n");
1601
       return -1;
1602
    }
1603
    pstrcpy(ifname, ifname_size, dev);
1604
    fcntl(fd, F_SETFL, O_NONBLOCK);
1605
    return fd;
1606
}
1607
#elif defined (_AIX)
1608
static int tap_open(char *ifname, int ifname_size)
1609
{
1610
    fprintf (stderr, "no tap on AIX\n");
1611
    return -1;
1612
}
1613
#else
1614
static int tap_open(char *ifname, int ifname_size)
1615
{
1616
    struct ifreq ifr;
1617
    int fd, ret;
1618

    
1619
    TFR(fd = open("/dev/net/tun", O_RDWR));
1620
    if (fd < 0) {
1621
        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
1622
        return -1;
1623
    }
1624
    memset(&ifr, 0, sizeof(ifr));
1625
    ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
1626
    if (ifname[0] != '\0')
1627
        pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
1628
    else
1629
        pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
1630
    ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
1631
    if (ret != 0) {
1632
        fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
1633
        close(fd);
1634
        return -1;
1635
    }
1636
    pstrcpy(ifname, ifname_size, ifr.ifr_name);
1637
    fcntl(fd, F_SETFL, O_NONBLOCK);
1638
    return fd;
1639
}
1640
#endif
1641

    
1642
static int launch_script(const char *setup_script, const char *ifname, int fd)
1643
{
1644
    sigset_t oldmask, mask;
1645
    int pid, status;
1646
    char *args[3];
1647
    char **parg;
1648

    
1649
    sigemptyset(&mask);
1650
    sigaddset(&mask, SIGCHLD);
1651
    sigprocmask(SIG_BLOCK, &mask, &oldmask);
1652

    
1653
    /* try to launch network script */
1654
    pid = fork();
1655
    if (pid == 0) {
1656
        int open_max = sysconf(_SC_OPEN_MAX), i;
1657

    
1658
        for (i = 0; i < open_max; i++) {
1659
            if (i != STDIN_FILENO &&
1660
                i != STDOUT_FILENO &&
1661
                i != STDERR_FILENO &&
1662
                i != fd) {
1663
                close(i);
1664
            }
1665
        }
1666
        parg = args;
1667
        *parg++ = (char *)setup_script;
1668
        *parg++ = (char *)ifname;
1669
        *parg++ = NULL;
1670
        execv(setup_script, args);
1671
        _exit(1);
1672
    } else if (pid > 0) {
1673
        while (waitpid(pid, &status, 0) != pid) {
1674
            /* loop */
1675
        }
1676
        sigprocmask(SIG_SETMASK, &oldmask, NULL);
1677

    
1678
        if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
1679
            return 0;
1680
        }
1681
    }
1682
    fprintf(stderr, "%s: could not launch network script\n", setup_script);
1683
    return -1;
1684
}
1685

    
1686
static TAPState *net_tap_init(VLANState *vlan, const char *model,
1687
                              const char *name, const char *ifname1,
1688
                              const char *setup_script, const char *down_script)
1689
{
1690
    TAPState *s;
1691
    int fd;
1692
    char ifname[128];
1693

    
1694
    if (ifname1 != NULL)
1695
        pstrcpy(ifname, sizeof(ifname), ifname1);
1696
    else
1697
        ifname[0] = '\0';
1698
    TFR(fd = tap_open(ifname, sizeof(ifname)));
1699
    if (fd < 0)
1700
        return NULL;
1701

    
1702
    if (!setup_script || !strcmp(setup_script, "no"))
1703
        setup_script = "";
1704
    if (setup_script[0] != '\0' &&
1705
        launch_script(setup_script, ifname, fd)) {
1706
        return NULL;
1707
    }
1708
    s = net_tap_fd_init(vlan, model, name, fd);
1709
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1710
             "ifname=%s,script=%s,downscript=%s",
1711
             ifname, setup_script, down_script);
1712
    if (down_script && strcmp(down_script, "no")) {
1713
        snprintf(s->down_script, sizeof(s->down_script), "%s", down_script);
1714
        snprintf(s->down_script_arg, sizeof(s->down_script_arg), "%s", ifname);
1715
    }
1716
    return s;
1717
}
1718

    
1719
#endif /* !_WIN32 */
1720

    
1721
#if defined(CONFIG_VDE)
1722
typedef struct VDEState {
1723
    VLANClientState *vc;
1724
    VDECONN *vde;
1725
} VDEState;
1726

    
1727
static void vde_to_qemu(void *opaque)
1728
{
1729
    VDEState *s = opaque;
1730
    uint8_t buf[4096];
1731
    int size;
1732

    
1733
    size = vde_recv(s->vde, (char *)buf, sizeof(buf), 0);
1734
    if (size > 0) {
1735
        qemu_send_packet(s->vc, buf, size);
1736
    }
1737
}
1738

    
1739
static ssize_t vde_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1740
{
1741
    VDEState *s = vc->opaque;
1742
    ssize_t ret;
1743

    
1744
    do {
1745
      ret = vde_send(s->vde, (const char *)buf, size, 0);
1746
    } while (ret < 0 && errno == EINTR);
1747

    
1748
    return ret;
1749
}
1750

    
1751
static void vde_cleanup(VLANClientState *vc)
1752
{
1753
    VDEState *s = vc->opaque;
1754
    qemu_set_fd_handler(vde_datafd(s->vde), NULL, NULL, NULL);
1755
    vde_close(s->vde);
1756
    qemu_free(s);
1757
}
1758

    
1759
static int net_vde_init(VLANState *vlan, const char *model,
1760
                        const char *name, const char *sock,
1761
                        int port, const char *group, int mode)
1762
{
1763
    VDEState *s;
1764
    char *init_group = (char *)group;
1765
    char *init_sock = (char *)sock;
1766

    
1767
    struct vde_open_args args = {
1768
        .port = port,
1769
        .group = init_group,
1770
        .mode = mode,
1771
    };
1772

    
1773
    s = qemu_mallocz(sizeof(VDEState));
1774
    s->vde = vde_open(init_sock, (char *)"QEMU", &args);
1775
    if (!s->vde){
1776
        free(s);
1777
        return -1;
1778
    }
1779
    s->vc = qemu_new_vlan_client(vlan, NULL, model, name, NULL,
1780
                                 vde_receive, NULL,
1781
                                 vde_cleanup, s);
1782
    qemu_set_fd_handler(vde_datafd(s->vde), vde_to_qemu, NULL, s);
1783
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), "sock=%s,fd=%d",
1784
             sock, vde_datafd(s->vde));
1785
    return 0;
1786
}
1787
#endif
1788

    
1789
/* network connection */
1790
typedef struct NetSocketState {
1791
    VLANClientState *vc;
1792
    int fd;
1793
    int state; /* 0 = getting length, 1 = getting data */
1794
    unsigned int index;
1795
    unsigned int packet_len;
1796
    uint8_t buf[4096];
1797
    struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
1798
} NetSocketState;
1799

    
1800
typedef struct NetSocketListenState {
1801
    VLANState *vlan;
1802
    char *model;
1803
    char *name;
1804
    int fd;
1805
} NetSocketListenState;
1806

    
1807
/* XXX: we consider we can send the whole packet without blocking */
1808
static ssize_t net_socket_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1809
{
1810
    NetSocketState *s = vc->opaque;
1811
    uint32_t len;
1812
    len = htonl(size);
1813

    
1814
    send_all(s->fd, (const uint8_t *)&len, sizeof(len));
1815
    return send_all(s->fd, buf, size);
1816
}
1817

    
1818
static ssize_t net_socket_receive_dgram(VLANClientState *vc, const uint8_t *buf, size_t size)
1819
{
1820
    NetSocketState *s = vc->opaque;
1821

    
1822
    return sendto(s->fd, (const void *)buf, size, 0,
1823
                  (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
1824
}
1825

    
1826
static void net_socket_send(void *opaque)
1827
{
1828
    NetSocketState *s = opaque;
1829
    int size, err;
1830
    unsigned l;
1831
    uint8_t buf1[4096];
1832
    const uint8_t *buf;
1833

    
1834
    size = recv(s->fd, (void *)buf1, sizeof(buf1), 0);
1835
    if (size < 0) {
1836
        err = socket_error();
1837
        if (err != EWOULDBLOCK)
1838
            goto eoc;
1839
    } else if (size == 0) {
1840
        /* end of connection */
1841
    eoc:
1842
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1843
        closesocket(s->fd);
1844
        return;
1845
    }
1846
    buf = buf1;
1847
    while (size > 0) {
1848
        /* reassemble a packet from the network */
1849
        switch(s->state) {
1850
        case 0:
1851
            l = 4 - s->index;
1852
            if (l > size)
1853
                l = size;
1854
            memcpy(s->buf + s->index, buf, l);
1855
            buf += l;
1856
            size -= l;
1857
            s->index += l;
1858
            if (s->index == 4) {
1859
                /* got length */
1860
                s->packet_len = ntohl(*(uint32_t *)s->buf);
1861
                s->index = 0;
1862
                s->state = 1;
1863
            }
1864
            break;
1865
        case 1:
1866
            l = s->packet_len - s->index;
1867
            if (l > size)
1868
                l = size;
1869
            if (s->index + l <= sizeof(s->buf)) {
1870
                memcpy(s->buf + s->index, buf, l);
1871
            } else {
1872
                fprintf(stderr, "serious error: oversized packet received,"
1873
                    "connection terminated.\n");
1874
                s->state = 0;
1875
                goto eoc;
1876
            }
1877

    
1878
            s->index += l;
1879
            buf += l;
1880
            size -= l;
1881
            if (s->index >= s->packet_len) {
1882
                qemu_send_packet(s->vc, s->buf, s->packet_len);
1883
                s->index = 0;
1884
                s->state = 0;
1885
            }
1886
            break;
1887
        }
1888
    }
1889
}
1890

    
1891
static void net_socket_send_dgram(void *opaque)
1892
{
1893
    NetSocketState *s = opaque;
1894
    int size;
1895

    
1896
    size = recv(s->fd, (void *)s->buf, sizeof(s->buf), 0);
1897
    if (size < 0)
1898
        return;
1899
    if (size == 0) {
1900
        /* end of connection */
1901
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1902
        return;
1903
    }
1904
    qemu_send_packet(s->vc, s->buf, size);
1905
}
1906

    
1907
static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
1908
{
1909
    struct ip_mreq imr;
1910
    int fd;
1911
    int val, ret;
1912
    if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
1913
        fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
1914
                inet_ntoa(mcastaddr->sin_addr),
1915
                (int)ntohl(mcastaddr->sin_addr.s_addr));
1916
        return -1;
1917

    
1918
    }
1919
    fd = socket(PF_INET, SOCK_DGRAM, 0);
1920
    if (fd < 0) {
1921
        perror("socket(PF_INET, SOCK_DGRAM)");
1922
        return -1;
1923
    }
1924

    
1925
    val = 1;
1926
    ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
1927
                   (const char *)&val, sizeof(val));
1928
    if (ret < 0) {
1929
        perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
1930
        goto fail;
1931
    }
1932

    
1933
    ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
1934
    if (ret < 0) {
1935
        perror("bind");
1936
        goto fail;
1937
    }
1938

    
1939
    /* Add host to multicast group */
1940
    imr.imr_multiaddr = mcastaddr->sin_addr;
1941
    imr.imr_interface.s_addr = htonl(INADDR_ANY);
1942

    
1943
    ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
1944
                     (const char *)&imr, sizeof(struct ip_mreq));
1945
    if (ret < 0) {
1946
        perror("setsockopt(IP_ADD_MEMBERSHIP)");
1947
        goto fail;
1948
    }
1949

    
1950
    /* Force mcast msgs to loopback (eg. several QEMUs in same host */
1951
    val = 1;
1952
    ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
1953
                   (const char *)&val, sizeof(val));
1954
    if (ret < 0) {
1955
        perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
1956
        goto fail;
1957
    }
1958

    
1959
    socket_set_nonblock(fd);
1960
    return fd;
1961
fail:
1962
    if (fd >= 0)
1963
        closesocket(fd);
1964
    return -1;
1965
}
1966

    
1967
static void net_socket_cleanup(VLANClientState *vc)
1968
{
1969
    NetSocketState *s = vc->opaque;
1970
    qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1971
    close(s->fd);
1972
    qemu_free(s);
1973
}
1974

    
1975
static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan,
1976
                                                const char *model,
1977
                                                const char *name,
1978
                                                int fd, int is_connected)
1979
{
1980
    struct sockaddr_in saddr;
1981
    int newfd;
1982
    socklen_t saddr_len;
1983
    NetSocketState *s;
1984

    
1985
    /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
1986
     * Because this may be "shared" socket from a "master" process, datagrams would be recv()
1987
     * by ONLY ONE process: we must "clone" this dgram socket --jjo
1988
     */
1989

    
1990
    if (is_connected) {
1991
        if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
1992
            /* must be bound */
1993
            if (saddr.sin_addr.s_addr==0) {
1994
                fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
1995
                        fd);
1996
                return NULL;
1997
            }
1998
            /* clone dgram socket */
1999
            newfd = net_socket_mcast_create(&saddr);
2000
            if (newfd < 0) {
2001
                /* error already reported by net_socket_mcast_create() */
2002
                close(fd);
2003
                return NULL;
2004
            }
2005
            /* clone newfd to fd, close newfd */
2006
            dup2(newfd, fd);
2007
            close(newfd);
2008

    
2009
        } else {
2010
            fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
2011
                    fd, strerror(errno));
2012
            return NULL;
2013
        }
2014
    }
2015

    
2016
    s = qemu_mallocz(sizeof(NetSocketState));
2017
    s->fd = fd;
2018

    
2019
    s->vc = qemu_new_vlan_client(vlan, NULL, model, name, NULL,
2020
                                 net_socket_receive_dgram, NULL,
2021
                                 net_socket_cleanup, s);
2022
    qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
2023

    
2024
    /* mcast: save bound address as dst */
2025
    if (is_connected) s->dgram_dst=saddr;
2026

    
2027
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2028
            "socket: fd=%d (%s mcast=%s:%d)",
2029
            fd, is_connected? "cloned" : "",
2030
            inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2031
    return s;
2032
}
2033

    
2034
static void net_socket_connect(void *opaque)
2035
{
2036
    NetSocketState *s = opaque;
2037
    qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
2038
}
2039

    
2040
static NetSocketState *net_socket_fd_init_stream(VLANState *vlan,
2041
                                                 const char *model,
2042
                                                 const char *name,
2043
                                                 int fd, int is_connected)
2044
{
2045
    NetSocketState *s;
2046
    s = qemu_mallocz(sizeof(NetSocketState));
2047
    s->fd = fd;
2048
    s->vc = qemu_new_vlan_client(vlan, NULL, model, name, NULL,
2049
                                 net_socket_receive, NULL,
2050
                                 net_socket_cleanup, s);
2051
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2052
             "socket: fd=%d", fd);
2053
    if (is_connected) {
2054
        net_socket_connect(s);
2055
    } else {
2056
        qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
2057
    }
2058
    return s;
2059
}
2060

    
2061
static NetSocketState *net_socket_fd_init(VLANState *vlan,
2062
                                          const char *model, const char *name,
2063
                                          int fd, int is_connected)
2064
{
2065
    int so_type = -1, optlen=sizeof(so_type);
2066

    
2067
    if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type,
2068
        (socklen_t *)&optlen)< 0) {
2069
        fprintf(stderr, "qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n", fd);
2070
        return NULL;
2071
    }
2072
    switch(so_type) {
2073
    case SOCK_DGRAM:
2074
        return net_socket_fd_init_dgram(vlan, model, name, fd, is_connected);
2075
    case SOCK_STREAM:
2076
        return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
2077
    default:
2078
        /* who knows ... this could be a eg. a pty, do warn and continue as stream */
2079
        fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
2080
        return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
2081
    }
2082
    return NULL;
2083
}
2084

    
2085
static void net_socket_accept(void *opaque)
2086
{
2087
    NetSocketListenState *s = opaque;
2088
    NetSocketState *s1;
2089
    struct sockaddr_in saddr;
2090
    socklen_t len;
2091
    int fd;
2092

    
2093
    for(;;) {
2094
        len = sizeof(saddr);
2095
        fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
2096
        if (fd < 0 && errno != EINTR) {
2097
            return;
2098
        } else if (fd >= 0) {
2099
            break;
2100
        }
2101
    }
2102
    s1 = net_socket_fd_init(s->vlan, s->model, s->name, fd, 1);
2103
    if (!s1) {
2104
        closesocket(fd);
2105
    } else {
2106
        snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
2107
                 "socket: connection from %s:%d",
2108
                 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2109
    }
2110
}
2111

    
2112
static int net_socket_listen_init(VLANState *vlan,
2113
                                  const char *model,
2114
                                  const char *name,
2115
                                  const char *host_str)
2116
{
2117
    NetSocketListenState *s;
2118
    int fd, val, ret;
2119
    struct sockaddr_in saddr;
2120

    
2121
    if (parse_host_port(&saddr, host_str) < 0)
2122
        return -1;
2123

    
2124
    s = qemu_mallocz(sizeof(NetSocketListenState));
2125

    
2126
    fd = socket(PF_INET, SOCK_STREAM, 0);
2127
    if (fd < 0) {
2128
        perror("socket");
2129
        return -1;
2130
    }
2131
    socket_set_nonblock(fd);
2132

    
2133
    /* allow fast reuse */
2134
    val = 1;
2135
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
2136

    
2137
    ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2138
    if (ret < 0) {
2139
        perror("bind");
2140
        return -1;
2141
    }
2142
    ret = listen(fd, 0);
2143
    if (ret < 0) {
2144
        perror("listen");
2145
        return -1;
2146
    }
2147
    s->vlan = vlan;
2148
    s->model = qemu_strdup(model);
2149
    s->name = name ? qemu_strdup(name) : NULL;
2150
    s->fd = fd;
2151
    qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
2152
    return 0;
2153
}
2154

    
2155
static int net_socket_connect_init(VLANState *vlan,
2156
                                   const char *model,
2157
                                   const char *name,
2158
                                   const char *host_str)
2159
{
2160
    NetSocketState *s;
2161
    int fd, connected, ret, err;
2162
    struct sockaddr_in saddr;
2163

    
2164
    if (parse_host_port(&saddr, host_str) < 0)
2165
        return -1;
2166

    
2167
    fd = socket(PF_INET, SOCK_STREAM, 0);
2168
    if (fd < 0) {
2169
        perror("socket");
2170
        return -1;
2171
    }
2172
    socket_set_nonblock(fd);
2173

    
2174
    connected = 0;
2175
    for(;;) {
2176
        ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2177
        if (ret < 0) {
2178
            err = socket_error();
2179
            if (err == EINTR || err == EWOULDBLOCK) {
2180
            } else if (err == EINPROGRESS) {
2181
                break;
2182
#ifdef _WIN32
2183
            } else if (err == WSAEALREADY) {
2184
                break;
2185
#endif
2186
            } else {
2187
                perror("connect");
2188
                closesocket(fd);
2189
                return -1;
2190
            }
2191
        } else {
2192
            connected = 1;
2193
            break;
2194
        }
2195
    }
2196
    s = net_socket_fd_init(vlan, model, name, fd, connected);
2197
    if (!s)
2198
        return -1;
2199
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2200
             "socket: connect to %s:%d",
2201
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2202
    return 0;
2203
}
2204

    
2205
static int net_socket_mcast_init(VLANState *vlan,
2206
                                 const char *model,
2207
                                 const char *name,
2208
                                 const char *host_str)
2209
{
2210
    NetSocketState *s;
2211
    int fd;
2212
    struct sockaddr_in saddr;
2213

    
2214
    if (parse_host_port(&saddr, host_str) < 0)
2215
        return -1;
2216

    
2217

    
2218
    fd = net_socket_mcast_create(&saddr);
2219
    if (fd < 0)
2220
        return -1;
2221

    
2222
    s = net_socket_fd_init(vlan, model, name, fd, 0);
2223
    if (!s)
2224
        return -1;
2225

    
2226
    s->dgram_dst = saddr;
2227

    
2228
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2229
             "socket: mcast=%s:%d",
2230
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2231
    return 0;
2232

    
2233
}
2234

    
2235
typedef struct DumpState {
2236
    VLANClientState *pcap_vc;
2237
    int fd;
2238
    int pcap_caplen;
2239
} DumpState;
2240

    
2241
#define PCAP_MAGIC 0xa1b2c3d4
2242

    
2243
struct pcap_file_hdr {
2244
    uint32_t magic;
2245
    uint16_t version_major;
2246
    uint16_t version_minor;
2247
    int32_t thiszone;
2248
    uint32_t sigfigs;
2249
    uint32_t snaplen;
2250
    uint32_t linktype;
2251
};
2252

    
2253
struct pcap_sf_pkthdr {
2254
    struct {
2255
        int32_t tv_sec;
2256
        int32_t tv_usec;
2257
    } ts;
2258
    uint32_t caplen;
2259
    uint32_t len;
2260
};
2261

    
2262
static ssize_t dump_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
2263
{
2264
    DumpState *s = vc->opaque;
2265
    struct pcap_sf_pkthdr hdr;
2266
    int64_t ts;
2267
    int caplen;
2268

    
2269
    /* Early return in case of previous error. */
2270
    if (s->fd < 0) {
2271
        return size;
2272
    }
2273

    
2274
    ts = muldiv64(qemu_get_clock(vm_clock), 1000000, get_ticks_per_sec());
2275
    caplen = size > s->pcap_caplen ? s->pcap_caplen : size;
2276

    
2277
    hdr.ts.tv_sec = ts / 1000000;
2278
    hdr.ts.tv_usec = ts % 1000000;
2279
    hdr.caplen = caplen;
2280
    hdr.len = size;
2281
    if (write(s->fd, &hdr, sizeof(hdr)) != sizeof(hdr) ||
2282
        write(s->fd, buf, caplen) != caplen) {
2283
        qemu_log("-net dump write error - stop dump\n");
2284
        close(s->fd);
2285
        s->fd = -1;
2286
    }
2287

    
2288
    return size;
2289
}
2290

    
2291
static void net_dump_cleanup(VLANClientState *vc)
2292
{
2293
    DumpState *s = vc->opaque;
2294

    
2295
    close(s->fd);
2296
    qemu_free(s);
2297
}
2298

    
2299
static int net_dump_init(VLANState *vlan, const char *device,
2300
                         const char *name, const char *filename, int len)
2301
{
2302
    struct pcap_file_hdr hdr;
2303
    DumpState *s;
2304

    
2305
    s = qemu_malloc(sizeof(DumpState));
2306

    
2307
    s->fd = open(filename, O_CREAT | O_WRONLY | O_BINARY, 0644);
2308
    if (s->fd < 0) {
2309
        qemu_error("-net dump: can't open %s\n", filename);
2310
        return -1;
2311
    }
2312

    
2313
    s->pcap_caplen = len;
2314

    
2315
    hdr.magic = PCAP_MAGIC;
2316
    hdr.version_major = 2;
2317
    hdr.version_minor = 4;
2318
    hdr.thiszone = 0;
2319
    hdr.sigfigs = 0;
2320
    hdr.snaplen = s->pcap_caplen;
2321
    hdr.linktype = 1;
2322

    
2323
    if (write(s->fd, &hdr, sizeof(hdr)) < sizeof(hdr)) {
2324
        qemu_error("-net dump write error: %s\n", strerror(errno));
2325
        close(s->fd);
2326
        qemu_free(s);
2327
        return -1;
2328
    }
2329

    
2330
    s->pcap_vc = qemu_new_vlan_client(vlan, NULL, device, name, NULL,
2331
                                      dump_receive, NULL,
2332
                                      net_dump_cleanup, s);
2333
    snprintf(s->pcap_vc->info_str, sizeof(s->pcap_vc->info_str),
2334
             "dump to %s (len=%d)", filename, len);
2335
    return 0;
2336
}
2337

    
2338
/* find or alloc a new VLAN */
2339
VLANState *qemu_find_vlan(int id, int allocate)
2340
{
2341
    VLANState *vlan;
2342

    
2343
    QTAILQ_FOREACH(vlan, &vlans, next) {
2344
        if (vlan->id == id) {
2345
            return vlan;
2346
        }
2347
    }
2348

    
2349
    if (!allocate) {
2350
        return NULL;
2351
    }
2352

    
2353
    vlan = qemu_mallocz(sizeof(VLANState));
2354
    vlan->id = id;
2355
    QTAILQ_INIT(&vlan->clients);
2356

    
2357
    vlan->send_queue = qemu_new_net_queue(qemu_vlan_deliver_packet,
2358
                                          qemu_vlan_deliver_packet_iov,
2359
                                          vlan);
2360

    
2361
    QTAILQ_INSERT_TAIL(&vlans, vlan, next);
2362

    
2363
    return vlan;
2364
}
2365

    
2366
VLANClientState *qemu_find_netdev(const char *id)
2367
{
2368
    VLANClientState *vc;
2369

    
2370
    QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
2371
        if (!strcmp(vc->name, id)) {
2372
            return vc;
2373
        }
2374
    }
2375

    
2376
    return NULL;
2377
}
2378

    
2379
static int nic_get_free_idx(void)
2380
{
2381
    int index;
2382

    
2383
    for (index = 0; index < MAX_NICS; index++)
2384
        if (!nd_table[index].used)
2385
            return index;
2386
    return -1;
2387
}
2388

    
2389
int qemu_show_nic_models(const char *arg, const char *const *models)
2390
{
2391
    int i;
2392

    
2393
    if (!arg || strcmp(arg, "?"))
2394
        return 0;
2395

    
2396
    fprintf(stderr, "qemu: Supported NIC models: ");
2397
    for (i = 0 ; models[i]; i++)
2398
        fprintf(stderr, "%s%c", models[i], models[i+1] ? ',' : '\n');
2399
    return 1;
2400
}
2401

    
2402
void qemu_check_nic_model(NICInfo *nd, const char *model)
2403
{
2404
    const char *models[2];
2405

    
2406
    models[0] = model;
2407
    models[1] = NULL;
2408

    
2409
    if (qemu_show_nic_models(nd->model, models))
2410
        exit(0);
2411
    if (qemu_find_nic_model(nd, models, model) < 0)
2412
        exit(1);
2413
}
2414

    
2415
int qemu_find_nic_model(NICInfo *nd, const char * const *models,
2416
                        const char *default_model)
2417
{
2418
    int i;
2419

    
2420
    if (!nd->model)
2421
        nd->model = qemu_strdup(default_model);
2422

    
2423
    for (i = 0 ; models[i]; i++) {
2424
        if (strcmp(nd->model, models[i]) == 0)
2425
            return i;
2426
    }
2427

    
2428
    qemu_error("qemu: Unsupported NIC model: %s\n", nd->model);
2429
    return -1;
2430
}
2431

    
2432
static int net_handle_fd_param(Monitor *mon, const char *param)
2433
{
2434
    if (!qemu_isdigit(param[0])) {
2435
        int fd;
2436

    
2437
        fd = monitor_get_fd(mon, param);
2438
        if (fd == -1) {
2439
            qemu_error("No file descriptor named %s found", param);
2440
            return -1;
2441
        }
2442

    
2443
        return fd;
2444
    } else {
2445
        return strtol(param, NULL, 0);
2446
    }
2447
}
2448

    
2449
static int net_init_nic(QemuOpts *opts,
2450
                        Monitor *mon,
2451
                        const char *name,
2452
                        VLANState *vlan)
2453
{
2454
    int idx;
2455
    NICInfo *nd;
2456
    const char *netdev;
2457

    
2458
    idx = nic_get_free_idx();
2459
    if (idx == -1 || nb_nics >= MAX_NICS) {
2460
        qemu_error("Too Many NICs\n");
2461
        return -1;
2462
    }
2463

    
2464
    nd = &nd_table[idx];
2465

    
2466
    memset(nd, 0, sizeof(*nd));
2467

    
2468
    if ((netdev = qemu_opt_get(opts, "netdev"))) {
2469
        nd->netdev = qemu_find_netdev(netdev);
2470
        if (!nd->netdev) {
2471
            qemu_error("netdev '%s' not found\n", netdev);
2472
            return -1;
2473
        }
2474
    } else {
2475
        assert(vlan);
2476
        nd->vlan = vlan;
2477
    }
2478
    if (name) {
2479
        nd->name = qemu_strdup(name);
2480
    }
2481
    if (qemu_opt_get(opts, "model")) {
2482
        nd->model = qemu_strdup(qemu_opt_get(opts, "model"));
2483
    }
2484
    if (qemu_opt_get(opts, "addr")) {
2485
        nd->devaddr = qemu_strdup(qemu_opt_get(opts, "addr"));
2486
    }
2487

    
2488
    nd->macaddr[0] = 0x52;
2489
    nd->macaddr[1] = 0x54;
2490
    nd->macaddr[2] = 0x00;
2491
    nd->macaddr[3] = 0x12;
2492
    nd->macaddr[4] = 0x34;
2493
    nd->macaddr[5] = 0x56 + idx;
2494

    
2495
    if (qemu_opt_get(opts, "macaddr") &&
2496
        parse_macaddr(nd->macaddr, qemu_opt_get(opts, "macaddr")) < 0) {
2497
        qemu_error("invalid syntax for ethernet address\n");
2498
        return -1;
2499
    }
2500

    
2501
    nd->nvectors = qemu_opt_get_number(opts, "vectors", NIC_NVECTORS_UNSPECIFIED);
2502
    if (nd->nvectors != NIC_NVECTORS_UNSPECIFIED &&
2503
        (nd->nvectors < 0 || nd->nvectors > 0x7ffffff)) {
2504
        qemu_error("invalid # of vectors: %d\n", nd->nvectors);
2505
        return -1;
2506
    }
2507

    
2508
    nd->used = 1;
2509
    if (vlan) {
2510
        nd->vlan->nb_guest_devs++;
2511
    }
2512
    nb_nics++;
2513

    
2514
    return idx;
2515
}
2516

    
2517
#if defined(CONFIG_SLIRP)
2518
static int net_init_slirp_configs(const char *name, const char *value, void *opaque)
2519
{
2520
    struct slirp_config_str *config;
2521

    
2522
    if (strcmp(name, "hostfwd") != 0 && strcmp(name, "guestfwd") != 0) {
2523
        return 0;
2524
    }
2525

    
2526
    config = qemu_mallocz(sizeof(*config));
2527

    
2528
    pstrcpy(config->str, sizeof(config->str), value);
2529

    
2530
    if (!strcmp(name, "hostfwd")) {
2531
        config->flags = SLIRP_CFG_HOSTFWD;
2532
    }
2533

    
2534
    config->next = slirp_configs;
2535
    slirp_configs = config;
2536

    
2537
    return 0;
2538
}
2539

    
2540
static int net_init_slirp(QemuOpts *opts,
2541
                          Monitor *mon,
2542
                          const char *name,
2543
                          VLANState *vlan)
2544
{
2545
    struct slirp_config_str *config;
2546
    const char *vhost;
2547
    const char *vhostname;
2548
    const char *vdhcp_start;
2549
    const char *vnamesrv;
2550
    const char *tftp_export;
2551
    const char *bootfile;
2552
    const char *smb_export;
2553
    const char *vsmbsrv;
2554
    char *vnet = NULL;
2555
    int restricted = 0;
2556
    int ret;
2557

    
2558
    vhost       = qemu_opt_get(opts, "host");
2559
    vhostname   = qemu_opt_get(opts, "hostname");
2560
    vdhcp_start = qemu_opt_get(opts, "dhcpstart");
2561
    vnamesrv    = qemu_opt_get(opts, "dns");
2562
    tftp_export = qemu_opt_get(opts, "tftp");
2563
    bootfile    = qemu_opt_get(opts, "bootfile");
2564
    smb_export  = qemu_opt_get(opts, "smb");
2565
    vsmbsrv     = qemu_opt_get(opts, "smbserver");
2566

    
2567
    if (qemu_opt_get(opts, "ip")) {
2568
        const char *ip = qemu_opt_get(opts, "ip");
2569
        int l = strlen(ip) + strlen("/24") + 1;
2570

    
2571
        vnet = qemu_malloc(l);
2572

    
2573
        /* emulate legacy ip= parameter */
2574
        pstrcpy(vnet, l, ip);
2575
        pstrcat(vnet, l, "/24");
2576
    }
2577

    
2578
    if (qemu_opt_get(opts, "net")) {
2579
        if (vnet) {
2580
            qemu_free(vnet);
2581
        }
2582
        vnet = qemu_strdup(qemu_opt_get(opts, "net"));
2583
    }
2584

    
2585
    if (qemu_opt_get(opts, "restrict") &&
2586
        qemu_opt_get(opts, "restrict")[0] == 'y') {
2587
        restricted = 1;
2588
    }
2589

    
2590
    qemu_opt_foreach(opts, net_init_slirp_configs, NULL, 0);
2591

    
2592
    ret = net_slirp_init(vlan, "user", name, restricted, vnet, vhost,
2593
                         vhostname, tftp_export, bootfile, vdhcp_start,
2594
                         vnamesrv, smb_export, vsmbsrv);
2595

    
2596
    while (slirp_configs) {
2597
        config = slirp_configs;
2598
        slirp_configs = config->next;
2599
        qemu_free(config);
2600
    }
2601

    
2602
    if (ret != -1 && vlan) {
2603
        vlan->nb_host_devs++;
2604
    }
2605

    
2606
    qemu_free(vnet);
2607

    
2608
    return ret;
2609
}
2610
#endif /* CONFIG_SLIRP */
2611

    
2612
#ifdef _WIN32
2613
static int net_init_tap_win32(QemuOpts *opts,
2614
                              Monitor *mon,
2615
                              const char *name,
2616
                              VLANState *vlan)
2617
{
2618
    const char *ifname;
2619

    
2620
    ifname = qemu_opt_get(opts, "ifname");
2621

    
2622
    if (!ifname) {
2623
        qemu_error("tap: no interface name\n");
2624
        return -1;
2625
    }
2626

    
2627
    if (tap_win32_init(vlan, "tap", name, ifname) == -1) {
2628
        return -1;
2629
    }
2630

    
2631
    if (vlan) {
2632
        vlan->nb_host_devs++;
2633
    }
2634

    
2635
    return 0;
2636
}
2637
#elif !defined(_AIX)
2638
static int net_init_tap(QemuOpts *opts,
2639
                        Monitor *mon,
2640
                        const char *name,
2641
                        VLANState *vlan)
2642
{
2643
    TAPState *s;
2644

    
2645
    if (qemu_opt_get(opts, "fd")) {
2646
        int fd;
2647

    
2648
        if (qemu_opt_get(opts, "ifname") ||
2649
            qemu_opt_get(opts, "script") ||
2650
            qemu_opt_get(opts, "downscript")) {
2651
            qemu_error("ifname=, script= and downscript= is invalid with fd=\n");
2652
            return -1;
2653
        }
2654

    
2655
        fd = net_handle_fd_param(mon, qemu_opt_get(opts, "fd"));
2656
        if (fd == -1) {
2657
            return -1;
2658
        }
2659

    
2660
        fcntl(fd, F_SETFL, O_NONBLOCK);
2661

    
2662
        s = net_tap_fd_init(vlan, "tap", name, fd);
2663
        if (!s) {
2664
            close(fd);
2665
        }
2666
    } else {
2667
        const char *ifname, *script, *downscript;
2668

    
2669
        ifname     = qemu_opt_get(opts, "ifname");
2670
        script     = qemu_opt_get(opts, "script");
2671
        downscript = qemu_opt_get(opts, "downscript");
2672

    
2673
        if (!script) {
2674
            script = DEFAULT_NETWORK_SCRIPT;
2675
        }
2676
        if (!downscript) {
2677
            downscript = DEFAULT_NETWORK_DOWN_SCRIPT;
2678
        }
2679

    
2680
        s = net_tap_init(vlan, "tap", name, ifname, script, downscript);
2681
    }
2682

    
2683
    if (!s) {
2684
        return -1;
2685
    }
2686

    
2687
    if (tap_set_sndbuf(s, opts) < 0) {
2688
        return -1;
2689
    }
2690

    
2691
    if (vlan) {
2692
        vlan->nb_host_devs++;
2693
    }
2694

    
2695
    return 0;
2696
}
2697
#endif
2698

    
2699
static int net_init_socket(QemuOpts *opts,
2700
                           Monitor *mon,
2701
                           const char *name,
2702
                           VLANState *vlan)
2703
{
2704
    if (qemu_opt_get(opts, "fd")) {
2705
        int fd;
2706

    
2707
        if (qemu_opt_get(opts, "listen") ||
2708
            qemu_opt_get(opts, "connect") ||
2709
            qemu_opt_get(opts, "mcast")) {
2710
            qemu_error("listen=, connect= and mcast= is invalid with fd=\n");
2711
            return -1;
2712
        }
2713

    
2714
        fd = net_handle_fd_param(mon, qemu_opt_get(opts, "fd"));
2715
        if (fd == -1) {
2716
            return -1;
2717
        }
2718

    
2719
        if (!net_socket_fd_init(vlan, "socket", name, fd, 1)) {
2720
            close(fd);
2721
            return -1;
2722
        }
2723
    } else if (qemu_opt_get(opts, "listen")) {
2724
        const char *listen;
2725

    
2726
        if (qemu_opt_get(opts, "fd") ||
2727
            qemu_opt_get(opts, "connect") ||
2728
            qemu_opt_get(opts, "mcast")) {
2729
            qemu_error("fd=, connect= and mcast= is invalid with listen=\n");
2730
            return -1;
2731
        }
2732

    
2733
        listen = qemu_opt_get(opts, "listen");
2734

    
2735
        if (net_socket_listen_init(vlan, "socket", name, listen) == -1) {
2736
            return -1;
2737
        }
2738
    } else if (qemu_opt_get(opts, "connect")) {
2739
        const char *connect;
2740

    
2741
        if (qemu_opt_get(opts, "fd") ||
2742
            qemu_opt_get(opts, "listen") ||
2743
            qemu_opt_get(opts, "mcast")) {
2744
            qemu_error("fd=, listen= and mcast= is invalid with connect=\n");
2745
            return -1;
2746
        }
2747

    
2748
        connect = qemu_opt_get(opts, "connect");
2749

    
2750
        if (net_socket_connect_init(vlan, "socket", name, connect) == -1) {
2751
            return -1;
2752
        }
2753
    } else if (qemu_opt_get(opts, "mcast")) {
2754
        const char *mcast;
2755

    
2756
        if (qemu_opt_get(opts, "fd") ||
2757
            qemu_opt_get(opts, "connect") ||
2758
            qemu_opt_get(opts, "listen")) {
2759
            qemu_error("fd=, connect= and listen= is invalid with mcast=\n");
2760
            return -1;
2761
        }
2762

    
2763
        mcast = qemu_opt_get(opts, "mcast");
2764

    
2765
        if (net_socket_mcast_init(vlan, "socket", name, mcast) == -1) {
2766
            return -1;
2767
        }
2768
    } else {
2769
        qemu_error("-socket requires fd=, listen=, connect= or mcast=\n");
2770
        return -1;
2771
    }
2772

    
2773
    if (vlan) {
2774
        vlan->nb_host_devs++;
2775
    }
2776

    
2777
    return 0;
2778
}
2779

    
2780
#ifdef CONFIG_VDE
2781
static int net_init_vde(QemuOpts *opts,
2782
                        Monitor *mon,
2783
                        const char *name,
2784
                        VLANState *vlan)
2785
{
2786
    const char *sock;
2787
    const char *group;
2788
    int port, mode;
2789

    
2790
    sock  = qemu_opt_get(opts, "sock");
2791
    group = qemu_opt_get(opts, "group");
2792

    
2793
    port = qemu_opt_get_number(opts, "port", 0);
2794
    mode = qemu_opt_get_number(opts, "mode", 0700);
2795

    
2796
    if (net_vde_init(vlan, "vde", name, sock, port, group, mode) == -1) {
2797
        return -1;
2798
    }
2799

    
2800
    if (vlan) {
2801
        vlan->nb_host_devs++;
2802
    }
2803

    
2804
    return 0;
2805
}
2806
#endif
2807

    
2808
static int net_init_dump(QemuOpts *opts,
2809
                         Monitor *mon,
2810
                         const char *name,
2811
                         VLANState *vlan)
2812
{
2813
    int len;
2814
    const char *file;
2815
    char def_file[128];
2816

    
2817
    assert(vlan);
2818

    
2819
    file = qemu_opt_get(opts, "file");
2820
    if (!file) {
2821
        snprintf(def_file, sizeof(def_file), "qemu-vlan%d.pcap", vlan->id);
2822
        file = def_file;
2823
    }
2824

    
2825
    len = qemu_opt_get_size(opts, "len", 65536);
2826

    
2827
    return net_dump_init(vlan, "dump", name, file, len);
2828
}
2829

    
2830
#define NET_COMMON_PARAMS_DESC                     \
2831
    {                                              \
2832
        .name = "type",                            \
2833
        .type = QEMU_OPT_STRING,                   \
2834
        .help = "net client type (nic, tap etc.)", \
2835
     }, {                                          \
2836
        .name = "vlan",                            \
2837
        .type = QEMU_OPT_NUMBER,                   \
2838
        .help = "vlan number",                     \
2839
     }, {                                          \
2840
        .name = "name",                            \
2841
        .type = QEMU_OPT_STRING,                   \
2842
        .help = "identifier for monitor commands", \
2843
     }
2844

    
2845
typedef int (*net_client_init_func)(QemuOpts *opts,
2846
                                    Monitor *mon,
2847
                                    const char *name,
2848
                                    VLANState *vlan);
2849

    
2850
/* magic number, but compiler will warn if too small */
2851
#define NET_MAX_DESC 20
2852

    
2853
static struct {
2854
    const char *type;
2855
    net_client_init_func init;
2856
    QemuOptDesc desc[NET_MAX_DESC];
2857
} net_client_types[] = {
2858
    {
2859
        .type = "none",
2860
        .desc = {
2861
            NET_COMMON_PARAMS_DESC,
2862
            { /* end of list */ }
2863
        },
2864
    }, {
2865
        .type = "nic",
2866
        .init = net_init_nic,
2867
        .desc = {
2868
            NET_COMMON_PARAMS_DESC,
2869
            {
2870
                .name = "netdev",
2871
                .type = QEMU_OPT_STRING,
2872
                .help = "id of -netdev to connect to",
2873
            },
2874
            {
2875
                .name = "macaddr",
2876
                .type = QEMU_OPT_STRING,
2877
                .help = "MAC address",
2878
            }, {
2879
                .name = "model",
2880
                .type = QEMU_OPT_STRING,
2881
                .help = "device model (e1000, rtl8139, virtio etc.)",
2882
            }, {
2883
                .name = "addr",
2884
                .type = QEMU_OPT_STRING,
2885
                .help = "PCI device address",
2886
            }, {
2887
                .name = "vectors",
2888
                .type = QEMU_OPT_NUMBER,
2889
                .help = "number of MSI-x vectors, 0 to disable MSI-X",
2890
            },
2891
            { /* end of list */ }
2892
        },
2893
#ifdef CONFIG_SLIRP
2894
    }, {
2895
        .type = "user",
2896
        .init = net_init_slirp,
2897
        .desc = {
2898
            NET_COMMON_PARAMS_DESC,
2899
            {
2900
                .name = "hostname",
2901
                .type = QEMU_OPT_STRING,
2902
                .help = "client hostname reported by the builtin DHCP server",
2903
            }, {
2904
                .name = "restrict",
2905
                .type = QEMU_OPT_STRING,
2906
                .help = "isolate the guest from the host (y|yes|n|no)",
2907
            }, {
2908
                .name = "ip",
2909
                .type = QEMU_OPT_STRING,
2910
                .help = "legacy parameter, use net= instead",
2911
            }, {
2912
                .name = "net",
2913
                .type = QEMU_OPT_STRING,
2914
                .help = "IP address and optional netmask",
2915
            }, {
2916
                .name = "host",
2917
                .type = QEMU_OPT_STRING,
2918
                .help = "guest-visible address of the host",
2919
            }, {
2920
                .name = "tftp",
2921
                .type = QEMU_OPT_STRING,
2922
                .help = "root directory of the built-in TFTP server",
2923
            }, {
2924
                .name = "bootfile",
2925
                .type = QEMU_OPT_STRING,
2926
                .help = "BOOTP filename, for use with tftp=",
2927
            }, {
2928
                .name = "dhcpstart",
2929
                .type = QEMU_OPT_STRING,
2930
                .help = "the first of the 16 IPs the built-in DHCP server can assign",
2931
            }, {
2932
                .name = "dns",
2933
                .type = QEMU_OPT_STRING,
2934
                .help = "guest-visible address of the virtual nameserver",
2935
            }, {
2936
                .name = "smb",
2937
                .type = QEMU_OPT_STRING,
2938
                .help = "root directory of the built-in SMB server",
2939
            }, {
2940
                .name = "smbserver",
2941
                .type = QEMU_OPT_STRING,
2942
                .help = "IP address of the built-in SMB server",
2943
            }, {
2944
                .name = "hostfwd",
2945
                .type = QEMU_OPT_STRING,
2946
                .help = "guest port number to forward incoming TCP or UDP connections",
2947
            }, {
2948
                .name = "guestfwd",
2949
                .type = QEMU_OPT_STRING,
2950
                .help = "IP address and port to forward guest TCP connections",
2951
            },
2952
            { /* end of list */ }
2953
        },
2954
#endif
2955
#ifdef _WIN32
2956
    }, {
2957
        .type = "tap",
2958
        .init = net_init_tap_win32,
2959
        .desc = {
2960
            NET_COMMON_PARAMS_DESC,
2961
            {
2962
                .name = "ifname",
2963
                .type = QEMU_OPT_STRING,
2964
                .help = "interface name",
2965
            },
2966
            { /* end of list */ }
2967
        },
2968
#elif !defined(_AIX)
2969
    }, {
2970
        .type = "tap",
2971
        .init = net_init_tap,
2972
        .desc = {
2973
            NET_COMMON_PARAMS_DESC,
2974
            {
2975
                .name = "fd",
2976
                .type = QEMU_OPT_STRING,
2977
                .help = "file descriptor of an already opened tap",
2978
            }, {
2979
                .name = "ifname",
2980
                .type = QEMU_OPT_STRING,
2981
                .help = "interface name",
2982
            }, {
2983
                .name = "script",
2984
                .type = QEMU_OPT_STRING,
2985
                .help = "script to initialize the interface",
2986
            }, {
2987
                .name = "downscript",
2988
                .type = QEMU_OPT_STRING,
2989
                .help = "script to shut down the interface",
2990
#ifdef TUNSETSNDBUF
2991
            }, {
2992
                .name = "sndbuf",
2993
                .type = QEMU_OPT_SIZE,
2994
                .help = "send buffer limit"
2995
#endif
2996
            },
2997
            { /* end of list */ }
2998
        },
2999
#endif
3000
    }, {
3001
        .type = "socket",
3002
        .init = net_init_socket,
3003
        .desc = {
3004
            NET_COMMON_PARAMS_DESC,
3005
            {
3006
                .name = "fd",
3007
                .type = QEMU_OPT_STRING,
3008
                .help = "file descriptor of an already opened socket",
3009
            }, {
3010
                .name = "listen",
3011
                .type = QEMU_OPT_STRING,
3012
                .help = "port number, and optional hostname, to listen on",
3013
            }, {
3014
                .name = "connect",
3015
                .type = QEMU_OPT_STRING,
3016
                .help = "port number, and optional hostname, to connect to",
3017
            }, {
3018
                .name = "mcast",
3019
                .type = QEMU_OPT_STRING,
3020
                .help = "UDP multicast address and port number",
3021
            },
3022
            { /* end of list */ }
3023
        },
3024
#ifdef CONFIG_VDE
3025
    }, {
3026
        .type = "vde",
3027
        .init = net_init_vde,
3028
        .desc = {
3029
            NET_COMMON_PARAMS_DESC,
3030
            {
3031
                .name = "sock",
3032
                .type = QEMU_OPT_STRING,
3033
                .help = "socket path",
3034
            }, {
3035
                .name = "port",
3036
                .type = QEMU_OPT_NUMBER,
3037
                .help = "port number",
3038
            }, {
3039
                .name = "group",
3040
                .type = QEMU_OPT_STRING,
3041
                .help = "group owner of socket",
3042
            }, {
3043
                .name = "mode",
3044
                .type = QEMU_OPT_NUMBER,
3045
                .help = "permissions for socket",
3046
            },
3047
            { /* end of list */ }
3048
        },
3049
#endif
3050
    }, {
3051
        .type = "dump",
3052
        .init = net_init_dump,
3053
        .desc = {
3054
            NET_COMMON_PARAMS_DESC,
3055
            {
3056
                .name = "len",
3057
                .type = QEMU_OPT_SIZE,
3058
                .help = "per-packet size limit (64k default)",
3059
            }, {
3060
                .name = "file",
3061
                .type = QEMU_OPT_STRING,
3062
                .help = "dump file path (default is qemu-vlan0.pcap)",
3063
            },
3064
            { /* end of list */ }
3065
        },
3066
    },
3067
    { /* end of list */ }
3068
};
3069

    
3070
int net_client_init(Monitor *mon, QemuOpts *opts, int is_netdev)
3071
{
3072
    const char *name;
3073
    const char *type;
3074
    int i;
3075

    
3076
    type = qemu_opt_get(opts, "type");
3077
    if (!type) {
3078
        qemu_error("No type specified for -net\n");
3079
        return -1;
3080
    }
3081

    
3082
    if (is_netdev) {
3083
        if (strcmp(type, "tap") != 0 &&
3084
#ifdef CONFIG_SLIRP
3085
            strcmp(type, "user") != 0 &&
3086
#endif
3087
#ifdef CONFIG_VDE
3088
            strcmp(type, "vde") != 0 &&
3089
#endif
3090
            strcmp(type, "socket") != 0) {
3091
            qemu_error("The '%s' network backend type is not valid with -netdev\n",
3092
                       type);
3093
            return -1;
3094
        }
3095

    
3096
        if (qemu_opt_get(opts, "vlan")) {
3097
            qemu_error("The 'vlan' parameter is not valid with -netdev\n");
3098
            return -1;
3099
        }
3100
        if (qemu_opt_get(opts, "name")) {
3101
            qemu_error("The 'name' parameter is not valid with -netdev\n");
3102
            return -1;
3103
        }
3104
        if (!qemu_opts_id(opts)) {
3105
            qemu_error("The id= parameter is required with -netdev\n");
3106
            return -1;
3107
        }
3108
    }
3109

    
3110
    name = qemu_opts_id(opts);
3111
    if (!name) {
3112
        name = qemu_opt_get(opts, "name");
3113
    }
3114

    
3115
    for (i = 0; net_client_types[i].type != NULL; i++) {
3116
        if (!strcmp(net_client_types[i].type, type)) {
3117
            VLANState *vlan = NULL;
3118

    
3119
            if (qemu_opts_validate(opts, &net_client_types[i].desc[0]) == -1) {
3120
                return -1;
3121
            }
3122

    
3123
            /* Do not add to a vlan if it's a -netdev or a nic with a
3124
             * netdev= parameter. */
3125
            if (!(is_netdev ||
3126
                  (strcmp(type, "nic") == 0 && qemu_opt_get(opts, "netdev")))) {
3127
                vlan = qemu_find_vlan(qemu_opt_get_number(opts, "vlan", 0), 1);
3128
            }
3129

    
3130
            if (net_client_types[i].init) {
3131
                return net_client_types[i].init(opts, mon, name, vlan);
3132
            } else {
3133
                return 0;
3134
            }
3135
        }
3136
    }
3137

    
3138
    qemu_error("Invalid -net type '%s'\n", type);
3139
    return -1;
3140
}
3141

    
3142
void net_client_uninit(NICInfo *nd)
3143
{
3144
    if (nd->vlan) {
3145
        nd->vlan->nb_guest_devs--;
3146
    }
3147
    nb_nics--;
3148

    
3149
    qemu_free(nd->model);
3150
    qemu_free(nd->name);
3151
    qemu_free(nd->devaddr);
3152

    
3153
    nd->used = 0;
3154
}
3155

    
3156
static int net_host_check_device(const char *device)
3157
{
3158
    int i;
3159
    const char *valid_param_list[] = { "tap", "socket", "dump"
3160
#ifdef CONFIG_SLIRP
3161
                                       ,"user"
3162
#endif
3163
#ifdef CONFIG_VDE
3164
                                       ,"vde"
3165
#endif
3166
    };
3167
    for (i = 0; i < sizeof(valid_param_list) / sizeof(char *); i++) {
3168
        if (!strncmp(valid_param_list[i], device,
3169
                     strlen(valid_param_list[i])))
3170
            return 1;
3171
    }
3172

    
3173
    return 0;
3174
}
3175

    
3176
void net_host_device_add(Monitor *mon, const QDict *qdict)
3177
{
3178
    const char *device = qdict_get_str(qdict, "device");
3179
    const char *opts_str = qdict_get_try_str(qdict, "opts");
3180
    QemuOpts *opts;
3181

    
3182
    if (!net_host_check_device(device)) {
3183
        monitor_printf(mon, "invalid host network device %s\n", device);
3184
        return;
3185
    }
3186

    
3187
    opts = qemu_opts_parse(&qemu_net_opts, opts_str ? opts_str : "", NULL);
3188
    if (!opts) {
3189
        monitor_printf(mon, "parsing network options '%s' failed\n",
3190
                       opts_str ? opts_str : "");
3191
        return;
3192
    }
3193

    
3194
    qemu_opt_set(opts, "type", device);
3195

    
3196
    if (net_client_init(mon, opts, 0) < 0) {
3197
        monitor_printf(mon, "adding host network device %s failed\n", device);
3198
    }
3199
}
3200

    
3201
void net_host_device_remove(Monitor *mon, const QDict *qdict)
3202
{
3203
    VLANClientState *vc;
3204
    int vlan_id = qdict_get_int(qdict, "vlan_id");
3205
    const char *device = qdict_get_str(qdict, "device");
3206

    
3207
    vc = qemu_find_vlan_client_by_name(mon, vlan_id, device);
3208
    if (!vc) {
3209
        return;
3210
    }
3211
    if (!net_host_check_device(vc->model)) {
3212
        monitor_printf(mon, "invalid host network device %s\n", device);
3213
        return;
3214
    }
3215
    qemu_del_vlan_client(vc);
3216
}
3217

    
3218
void net_set_boot_mask(int net_boot_mask)
3219
{
3220
    int i;
3221

    
3222
    /* Only the first four NICs may be bootable */
3223
    net_boot_mask = net_boot_mask & 0xF;
3224

    
3225
    for (i = 0; i < nb_nics; i++) {
3226
        if (net_boot_mask & (1 << i)) {
3227
            nd_table[i].bootable = 1;
3228
            net_boot_mask &= ~(1 << i);
3229
        }
3230
    }
3231

    
3232
    if (net_boot_mask) {
3233
        fprintf(stderr, "Cannot boot from non-existent NIC\n");
3234
        exit(1);
3235
    }
3236
}
3237

    
3238
void do_info_network(Monitor *mon)
3239
{
3240
    VLANState *vlan;
3241

    
3242
    QTAILQ_FOREACH(vlan, &vlans, next) {
3243
        VLANClientState *vc;
3244

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

    
3247
        QTAILQ_FOREACH(vc, &vlan->clients, next) {
3248
            monitor_printf(mon, "  %s: %s\n", vc->name, vc->info_str);
3249
        }
3250
    }
3251
}
3252

    
3253
void do_set_link(Monitor *mon, const QDict *qdict)
3254
{
3255
    VLANState *vlan;
3256
    VLANClientState *vc = NULL;
3257
    const char *name = qdict_get_str(qdict, "name");
3258
    const char *up_or_down = qdict_get_str(qdict, "up_or_down");
3259

    
3260
    QTAILQ_FOREACH(vlan, &vlans, next) {
3261
        QTAILQ_FOREACH(vc, &vlan->clients, next) {
3262
            if (strcmp(vc->name, name) == 0) {
3263
                goto done;
3264
            }
3265
        }
3266
    }
3267
done:
3268

    
3269
    if (!vc) {
3270
        monitor_printf(mon, "could not find network device '%s'\n", name);
3271
        return;
3272
    }
3273

    
3274
    if (strcmp(up_or_down, "up") == 0)
3275
        vc->link_down = 0;
3276
    else if (strcmp(up_or_down, "down") == 0)
3277
        vc->link_down = 1;
3278
    else
3279
        monitor_printf(mon, "invalid link status '%s'; only 'up' or 'down' "
3280
                       "valid\n", up_or_down);
3281

    
3282
    if (vc->link_status_changed)
3283
        vc->link_status_changed(vc);
3284
}
3285

    
3286
void net_cleanup(void)
3287
{
3288
    VLANState *vlan;
3289
    VLANClientState *vc, *next_vc;
3290

    
3291
    QTAILQ_FOREACH(vlan, &vlans, next) {
3292
        QTAILQ_FOREACH_SAFE(vc, &vlan->clients, next, next_vc) {
3293
            qemu_del_vlan_client(vc);
3294
        }
3295
    }
3296

    
3297
    QTAILQ_FOREACH_SAFE(vc, &non_vlan_clients, next, next_vc) {
3298
        qemu_del_vlan_client(vc);
3299
    }
3300
}
3301

    
3302
static void net_check_clients(void)
3303
{
3304
    VLANState *vlan;
3305

    
3306
    QTAILQ_FOREACH(vlan, &vlans, next) {
3307
        if (vlan->nb_guest_devs == 0 && vlan->nb_host_devs == 0)
3308
            continue;
3309
        if (vlan->nb_guest_devs == 0)
3310
            fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id);
3311
        if (vlan->nb_host_devs == 0)
3312
            fprintf(stderr,
3313
                    "Warning: vlan %d is not connected to host network\n",
3314
                    vlan->id);
3315
    }
3316
}
3317

    
3318
static int net_init_client(QemuOpts *opts, void *dummy)
3319
{
3320
    if (net_client_init(NULL, opts, 0) < 0)
3321
        return -1;
3322
    return 0;
3323
}
3324

    
3325
static int net_init_netdev(QemuOpts *opts, void *dummy)
3326
{
3327
    return net_client_init(NULL, opts, 1);
3328
}
3329

    
3330
int net_init_clients(void)
3331
{
3332
    if (QTAILQ_EMPTY(&qemu_net_opts.head)) {
3333
        /* if no clients, we use a default config */
3334
        qemu_opts_set(&qemu_net_opts, NULL, "type", "nic");
3335
#ifdef CONFIG_SLIRP
3336
        qemu_opts_set(&qemu_net_opts, NULL, "type", "user");
3337
#endif
3338
    }
3339

    
3340
    QTAILQ_INIT(&vlans);
3341
    QTAILQ_INIT(&non_vlan_clients);
3342

    
3343
    if (qemu_opts_foreach(&qemu_netdev_opts, net_init_netdev, NULL, 1) == -1)
3344
        return -1;
3345

    
3346
    if (qemu_opts_foreach(&qemu_net_opts, net_init_client, NULL, 1) == -1) {
3347
        return -1;
3348
    }
3349

    
3350
    net_check_clients();
3351

    
3352
    return 0;
3353
}
3354

    
3355
int net_client_parse(QemuOptsList *opts_list, const char *optarg)
3356
{
3357
#if defined(CONFIG_SLIRP)
3358
    /* handle legacy -net channel,port:chr */
3359
    if (!strcmp(opts_list->name, "net") &&
3360
        !strncmp(optarg, "channel,", strlen("channel,"))) {
3361
        int ret;
3362

    
3363
        optarg += strlen("channel,");
3364

    
3365
        if (QTAILQ_EMPTY(&slirp_stacks)) {
3366
            struct slirp_config_str *config;
3367

    
3368
            config = qemu_malloc(sizeof(*config));
3369
            pstrcpy(config->str, sizeof(config->str), optarg);
3370
            config->flags = SLIRP_CFG_LEGACY;
3371
            config->next = slirp_configs;
3372
            slirp_configs = config;
3373
            ret = 0;
3374
        } else {
3375
            ret = slirp_guestfwd(QTAILQ_FIRST(&slirp_stacks), optarg, 1);
3376
        }
3377

    
3378
        return ret;
3379
    }
3380
#endif
3381
    if (!qemu_opts_parse(opts_list, optarg, "type")) {
3382
        return -1;
3383
    }
3384

    
3385
    return 0;
3386
}