Statistics
| Branch: | Revision:

root / net.c @ f54c7bdc

History | View | Annotate | Download (93.3 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 "net/tap-linux.h"
50
#endif
51
#include <arpa/inet.h>
52
#include <dirent.h>
53
#include <netdb.h>
54
#include <sys/select.h>
55
#ifdef CONFIG_BSD
56
#include <sys/stat.h>
57
#if defined(__FreeBSD__) || defined(__DragonFly__)
58
#include <libutil.h>
59
#else
60
#include <util.h>
61
#endif
62
#elif defined (__GLIBC__) && defined (__FreeBSD_kernel__)
63
#include <freebsd/stdlib.h>
64
#else
65
#ifdef __linux__
66
#include <pty.h>
67
#include <malloc.h>
68
#include <linux/rtc.h>
69

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

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

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

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

    
104
#include "qemu-common.h"
105
#include "net.h"
106
#include "net/tap.h"
107
#include "monitor.h"
108
#include "sysemu.h"
109
#include "qemu-timer.h"
110
#include "qemu-char.h"
111
#include "audio/audio.h"
112
#include "qemu_socket.h"
113
#include "qemu-log.h"
114
#include "qemu-config.h"
115

    
116
#include "slirp/libslirp.h"
117

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

    
121
/***********************************************************/
122
/* network device redirectors */
123

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

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

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

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

    
181
    return -1;
182
}
183

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
317
    return qemu_strdup(buf);
318
}
319

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

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

    
345
    vc = qemu_mallocz(sizeof(VLANClientState));
346

    
347
    vc->type = type;
348
    vc->model = qemu_strdup(model);
349
    if (name)
350
        vc->name = qemu_strdup(name);
351
    else
352
        vc->name = assign_name(vc, model);
353
    vc->can_receive = can_receive;
354
    vc->receive = receive;
355
    vc->receive_raw = receive_raw;
356
    vc->receive_iov = receive_iov;
357
    vc->cleanup = cleanup;
358
    vc->opaque = opaque;
359

    
360
    if (vlan) {
361
        assert(!peer);
362
        vc->vlan = vlan;
363
        QTAILQ_INSERT_TAIL(&vc->vlan->clients, vc, next);
364
    } else {
365
        if (peer) {
366
            vc->peer = peer;
367
            peer->peer = vc;
368
        }
369
        QTAILQ_INSERT_TAIL(&non_vlan_clients, vc, next);
370

    
371
        vc->send_queue = qemu_new_net_queue(qemu_deliver_packet,
372
                                            qemu_deliver_packet_iov,
373
                                            vc);
374
    }
375

    
376
    return vc;
377
}
378

    
379
void qemu_del_vlan_client(VLANClientState *vc)
380
{
381
    if (vc->vlan) {
382
        QTAILQ_REMOVE(&vc->vlan->clients, vc, next);
383
    } else {
384
        if (vc->send_queue) {
385
            qemu_del_net_queue(vc->send_queue);
386
        }
387
        QTAILQ_REMOVE(&non_vlan_clients, vc, next);
388
        if (vc->peer) {
389
            vc->peer->peer = NULL;
390
        }
391
    }
392

    
393
    if (vc->cleanup) {
394
        vc->cleanup(vc);
395
    }
396

    
397
    qemu_free(vc->name);
398
    qemu_free(vc->model);
399
    qemu_free(vc);
400
}
401

    
402
VLANClientState *qemu_find_vlan_client(VLANState *vlan, void *opaque)
403
{
404
    VLANClientState *vc;
405

    
406
    QTAILQ_FOREACH(vc, &vlan->clients, next) {
407
        if (vc->opaque == opaque) {
408
            return vc;
409
        }
410
    }
411

    
412
    return NULL;
413
}
414

    
415
static VLANClientState *
416
qemu_find_vlan_client_by_name(Monitor *mon, int vlan_id,
417
                              const char *client_str)
418
{
419
    VLANState *vlan;
420
    VLANClientState *vc;
421

    
422
    vlan = qemu_find_vlan(vlan_id, 0);
423
    if (!vlan) {
424
        monitor_printf(mon, "unknown VLAN %d\n", vlan_id);
425
        return NULL;
426
    }
427

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

    
438
    return vc;
439
}
440

    
441
int qemu_can_send_packet(VLANClientState *sender)
442
{
443
    VLANState *vlan = sender->vlan;
444
    VLANClientState *vc;
445

    
446
    if (sender->peer) {
447
        if (!sender->peer->can_receive ||
448
            sender->peer->can_receive(sender->peer)) {
449
            return 1;
450
        } else {
451
            return 0;
452
        }
453
    }
454

    
455
    if (!sender->vlan) {
456
        return 1;
457
    }
458

    
459
    QTAILQ_FOREACH(vc, &vlan->clients, next) {
460
        if (vc == sender) {
461
            continue;
462
        }
463

    
464
        /* no can_receive() handler, they can always receive */
465
        if (!vc->can_receive || vc->can_receive(vc)) {
466
            return 1;
467
        }
468
    }
469
    return 0;
470
}
471

    
472
static ssize_t qemu_deliver_packet(VLANClientState *sender,
473
                                   unsigned flags,
474
                                   const uint8_t *data,
475
                                   size_t size,
476
                                   void *opaque)
477
{
478
    VLANClientState *vc = opaque;
479

    
480
    if (vc->link_down) {
481
        return size;
482
    }
483

    
484
    if (flags & QEMU_NET_PACKET_FLAG_RAW && vc->receive_raw)
485
        return vc->receive_raw(vc, data, size);
486
    else
487
        return vc->receive(vc, data, size);
488
}
489

    
490
static ssize_t qemu_vlan_deliver_packet(VLANClientState *sender,
491
                                        unsigned flags,
492
                                        const uint8_t *buf,
493
                                        size_t size,
494
                                        void *opaque)
495
{
496
    VLANState *vlan = opaque;
497
    VLANClientState *vc;
498
    int ret = -1;
499

    
500
    QTAILQ_FOREACH(vc, &vlan->clients, next) {
501
        ssize_t len;
502

    
503
        if (vc == sender) {
504
            continue;
505
        }
506

    
507
        if (vc->link_down) {
508
            ret = size;
509
            continue;
510
        }
511

    
512
        if (flags & QEMU_NET_PACKET_FLAG_RAW && vc->receive_raw)
513
            len = vc->receive_raw(vc, buf, size);
514
        else
515
            len = vc->receive(vc, buf, size);
516

    
517
        ret = (ret >= 0) ? ret : len;
518
    }
519

    
520
    return ret;
521
}
522

    
523
void qemu_purge_queued_packets(VLANClientState *vc)
524
{
525
    NetQueue *queue;
526

    
527
    if (!vc->peer && !vc->vlan) {
528
        return;
529
    }
530

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

    
537
    qemu_net_queue_purge(queue, vc);
538
}
539

    
540
void qemu_flush_queued_packets(VLANClientState *vc)
541
{
542
    NetQueue *queue;
543

    
544
    if (vc->vlan) {
545
        queue = vc->vlan->send_queue;
546
    } else {
547
        queue = vc->send_queue;
548
    }
549

    
550
    qemu_net_queue_flush(queue);
551
}
552

    
553
static ssize_t qemu_send_packet_async_with_flags(VLANClientState *sender,
554
                                                 unsigned flags,
555
                                                 const uint8_t *buf, int size,
556
                                                 NetPacketSent *sent_cb)
557
{
558
    NetQueue *queue;
559

    
560
#ifdef DEBUG_NET
561
    printf("qemu_send_packet_async:\n");
562
    hex_dump(stdout, buf, size);
563
#endif
564

    
565
    if (sender->link_down || (!sender->peer && !sender->vlan)) {
566
        return size;
567
    }
568

    
569
    if (sender->peer) {
570
        queue = sender->peer->send_queue;
571
    } else {
572
        queue = sender->vlan->send_queue;
573
    }
574

    
575
    return qemu_net_queue_send(queue, sender, flags, buf, size, sent_cb);
576
}
577

    
578
ssize_t qemu_send_packet_async(VLANClientState *sender,
579
                               const uint8_t *buf, int size,
580
                               NetPacketSent *sent_cb)
581
{
582
    return qemu_send_packet_async_with_flags(sender, QEMU_NET_PACKET_FLAG_NONE,
583
                                             buf, size, sent_cb);
584
}
585

    
586
void qemu_send_packet(VLANClientState *vc, const uint8_t *buf, int size)
587
{
588
    qemu_send_packet_async(vc, buf, size, NULL);
589
}
590

    
591
ssize_t qemu_send_packet_raw(VLANClientState *vc, const uint8_t *buf, int size)
592
{
593
    return qemu_send_packet_async_with_flags(vc, QEMU_NET_PACKET_FLAG_RAW,
594
                                             buf, size, NULL);
595
}
596

    
597
static ssize_t vc_sendv_compat(VLANClientState *vc, const struct iovec *iov,
598
                               int iovcnt)
599
{
600
    uint8_t buffer[4096];
601
    size_t offset = 0;
602
    int i;
603

    
604
    for (i = 0; i < iovcnt; i++) {
605
        size_t len;
606

    
607
        len = MIN(sizeof(buffer) - offset, iov[i].iov_len);
608
        memcpy(buffer + offset, iov[i].iov_base, len);
609
        offset += len;
610
    }
611

    
612
    return vc->receive(vc, buffer, offset);
613
}
614

    
615
static ssize_t calc_iov_length(const struct iovec *iov, int iovcnt)
616
{
617
    size_t offset = 0;
618
    int i;
619

    
620
    for (i = 0; i < iovcnt; i++)
621
        offset += iov[i].iov_len;
622
    return offset;
623
}
624

    
625
static ssize_t qemu_deliver_packet_iov(VLANClientState *sender,
626
                                       unsigned flags,
627
                                       const struct iovec *iov,
628
                                       int iovcnt,
629
                                       void *opaque)
630
{
631
    VLANClientState *vc = opaque;
632

    
633
    if (vc->link_down) {
634
        return calc_iov_length(iov, iovcnt);
635
    }
636

    
637
    if (vc->receive_iov) {
638
        return vc->receive_iov(vc, iov, iovcnt);
639
    } else {
640
        return vc_sendv_compat(vc, iov, iovcnt);
641
    }
642
}
643

    
644
static ssize_t qemu_vlan_deliver_packet_iov(VLANClientState *sender,
645
                                            unsigned flags,
646
                                            const struct iovec *iov,
647
                                            int iovcnt,
648
                                            void *opaque)
649
{
650
    VLANState *vlan = opaque;
651
    VLANClientState *vc;
652
    ssize_t ret = -1;
653

    
654
    QTAILQ_FOREACH(vc, &vlan->clients, next) {
655
        ssize_t len;
656

    
657
        if (vc == sender) {
658
            continue;
659
        }
660

    
661
        if (vc->link_down) {
662
            ret = calc_iov_length(iov, iovcnt);
663
            continue;
664
        }
665

    
666
        assert(!(flags & QEMU_NET_PACKET_FLAG_RAW));
667

    
668
        if (vc->receive_iov) {
669
            len = vc->receive_iov(vc, iov, iovcnt);
670
        } else {
671
            len = vc_sendv_compat(vc, iov, iovcnt);
672
        }
673

    
674
        ret = (ret >= 0) ? ret : len;
675
    }
676

    
677
    return ret;
678
}
679

    
680
ssize_t qemu_sendv_packet_async(VLANClientState *sender,
681
                                const struct iovec *iov, int iovcnt,
682
                                NetPacketSent *sent_cb)
683
{
684
    NetQueue *queue;
685

    
686
    if (sender->link_down || (!sender->peer && !sender->vlan)) {
687
        return calc_iov_length(iov, iovcnt);
688
    }
689

    
690
    if (sender->peer) {
691
        queue = sender->peer->send_queue;
692
    } else {
693
        queue = sender->vlan->send_queue;
694
    }
695

    
696
    return qemu_net_queue_send_iov(queue, sender,
697
                                   QEMU_NET_PACKET_FLAG_NONE,
698
                                   iov, iovcnt, sent_cb);
699
}
700

    
701
ssize_t
702
qemu_sendv_packet(VLANClientState *vc, const struct iovec *iov, int iovcnt)
703
{
704
    return qemu_sendv_packet_async(vc, iov, iovcnt, NULL);
705
}
706

    
707
#if defined(CONFIG_SLIRP)
708

    
709
/* slirp network adapter */
710

    
711
#define SLIRP_CFG_HOSTFWD 1
712
#define SLIRP_CFG_LEGACY  2
713

    
714
struct slirp_config_str {
715
    struct slirp_config_str *next;
716
    int flags;
717
    char str[1024];
718
    int legacy_format;
719
};
720

    
721
typedef struct SlirpState {
722
    QTAILQ_ENTRY(SlirpState) entry;
723
    VLANClientState *vc;
724
    Slirp *slirp;
725
#ifndef _WIN32
726
    char smb_dir[128];
727
#endif
728
} SlirpState;
729

    
730
static struct slirp_config_str *slirp_configs;
731
const char *legacy_tftp_prefix;
732
const char *legacy_bootp_filename;
733
static QTAILQ_HEAD(slirp_stacks, SlirpState) slirp_stacks =
734
    QTAILQ_HEAD_INITIALIZER(slirp_stacks);
735

    
736
static int slirp_hostfwd(SlirpState *s, const char *redir_str,
737
                         int legacy_format);
738
static int slirp_guestfwd(SlirpState *s, const char *config_str,
739
                          int legacy_format);
740

    
741
#ifndef _WIN32
742
static const char *legacy_smb_export;
743

    
744
static int slirp_smb(SlirpState *s, const char *exported_dir,
745
                     struct in_addr vserver_addr);
746
static void slirp_smb_cleanup(SlirpState *s);
747
#else
748
static inline void slirp_smb_cleanup(SlirpState *s) { }
749
#endif
750

    
751
int slirp_can_output(void *opaque)
752
{
753
    SlirpState *s = opaque;
754

    
755
    return qemu_can_send_packet(s->vc);
756
}
757

    
758
void slirp_output(void *opaque, const uint8_t *pkt, int pkt_len)
759
{
760
    SlirpState *s = opaque;
761

    
762
#ifdef DEBUG_SLIRP
763
    printf("slirp output:\n");
764
    hex_dump(stdout, pkt, pkt_len);
765
#endif
766
    qemu_send_packet(s->vc, pkt, pkt_len);
767
}
768

    
769
static ssize_t slirp_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
770
{
771
    SlirpState *s = vc->opaque;
772

    
773
#ifdef DEBUG_SLIRP
774
    printf("slirp input:\n");
775
    hex_dump(stdout, buf, size);
776
#endif
777
    slirp_input(s->slirp, buf, size);
778
    return size;
779
}
780

    
781
static void net_slirp_cleanup(VLANClientState *vc)
782
{
783
    SlirpState *s = vc->opaque;
784

    
785
    slirp_cleanup(s->slirp);
786
    slirp_smb_cleanup(s);
787
    QTAILQ_REMOVE(&slirp_stacks, s, entry);
788
    qemu_free(s);
789
}
790

    
791
static int net_slirp_init(VLANState *vlan, const char *model,
792
                          const char *name, int restricted,
793
                          const char *vnetwork, const char *vhost,
794
                          const char *vhostname, const char *tftp_export,
795
                          const char *bootfile, const char *vdhcp_start,
796
                          const char *vnameserver, const char *smb_export,
797
                          const char *vsmbserver)
798
{
799
    /* default settings according to historic slirp */
800
    struct in_addr net  = { .s_addr = htonl(0x0a000200) }; /* 10.0.2.0 */
801
    struct in_addr mask = { .s_addr = htonl(0xffffff00) }; /* 255.255.255.0 */
802
    struct in_addr host = { .s_addr = htonl(0x0a000202) }; /* 10.0.2.2 */
803
    struct in_addr dhcp = { .s_addr = htonl(0x0a00020f) }; /* 10.0.2.15 */
804
    struct in_addr dns  = { .s_addr = htonl(0x0a000203) }; /* 10.0.2.3 */
805
#ifndef _WIN32
806
    struct in_addr smbsrv = { .s_addr = 0 };
807
#endif
808
    SlirpState *s;
809
    char buf[20];
810
    uint32_t addr;
811
    int shift;
812
    char *end;
813
    struct slirp_config_str *config;
814

    
815
    if (!tftp_export) {
816
        tftp_export = legacy_tftp_prefix;
817
    }
818
    if (!bootfile) {
819
        bootfile = legacy_bootp_filename;
820
    }
821

    
822
    if (vnetwork) {
823
        if (get_str_sep(buf, sizeof(buf), &vnetwork, '/') < 0) {
824
            if (!inet_aton(vnetwork, &net)) {
825
                return -1;
826
            }
827
            addr = ntohl(net.s_addr);
828
            if (!(addr & 0x80000000)) {
829
                mask.s_addr = htonl(0xff000000); /* class A */
830
            } else if ((addr & 0xfff00000) == 0xac100000) {
831
                mask.s_addr = htonl(0xfff00000); /* priv. 172.16.0.0/12 */
832
            } else if ((addr & 0xc0000000) == 0x80000000) {
833
                mask.s_addr = htonl(0xffff0000); /* class B */
834
            } else if ((addr & 0xffff0000) == 0xc0a80000) {
835
                mask.s_addr = htonl(0xffff0000); /* priv. 192.168.0.0/16 */
836
            } else if ((addr & 0xffff0000) == 0xc6120000) {
837
                mask.s_addr = htonl(0xfffe0000); /* tests 198.18.0.0/15 */
838
            } else if ((addr & 0xe0000000) == 0xe0000000) {
839
                mask.s_addr = htonl(0xffffff00); /* class C */
840
            } else {
841
                mask.s_addr = htonl(0xfffffff0); /* multicast/reserved */
842
            }
843
        } else {
844
            if (!inet_aton(buf, &net)) {
845
                return -1;
846
            }
847
            shift = strtol(vnetwork, &end, 10);
848
            if (*end != '\0') {
849
                if (!inet_aton(vnetwork, &mask)) {
850
                    return -1;
851
                }
852
            } else if (shift < 4 || shift > 32) {
853
                return -1;
854
            } else {
855
                mask.s_addr = htonl(0xffffffff << (32 - shift));
856
            }
857
        }
858
        net.s_addr &= mask.s_addr;
859
        host.s_addr = net.s_addr | (htonl(0x0202) & ~mask.s_addr);
860
        dhcp.s_addr = net.s_addr | (htonl(0x020f) & ~mask.s_addr);
861
        dns.s_addr  = net.s_addr | (htonl(0x0203) & ~mask.s_addr);
862
    }
863

    
864
    if (vhost && !inet_aton(vhost, &host)) {
865
        return -1;
866
    }
867
    if ((host.s_addr & mask.s_addr) != net.s_addr) {
868
        return -1;
869
    }
870

    
871
    if (vdhcp_start && !inet_aton(vdhcp_start, &dhcp)) {
872
        return -1;
873
    }
874
    if ((dhcp.s_addr & mask.s_addr) != net.s_addr ||
875
        dhcp.s_addr == host.s_addr || dhcp.s_addr == dns.s_addr) {
876
        return -1;
877
    }
878

    
879
    if (vnameserver && !inet_aton(vnameserver, &dns)) {
880
        return -1;
881
    }
882
    if ((dns.s_addr & mask.s_addr) != net.s_addr ||
883
        dns.s_addr == host.s_addr) {
884
        return -1;
885
    }
886

    
887
#ifndef _WIN32
888
    if (vsmbserver && !inet_aton(vsmbserver, &smbsrv)) {
889
        return -1;
890
    }
891
#endif
892

    
893
    s = qemu_mallocz(sizeof(SlirpState));
894
    s->slirp = slirp_init(restricted, net, mask, host, vhostname,
895
                          tftp_export, bootfile, dhcp, dns, s);
896
    QTAILQ_INSERT_TAIL(&slirp_stacks, s, entry);
897

    
898
    for (config = slirp_configs; config; config = config->next) {
899
        if (config->flags & SLIRP_CFG_HOSTFWD) {
900
            if (slirp_hostfwd(s, config->str,
901
                              config->flags & SLIRP_CFG_LEGACY) < 0)
902
                return -1;
903
        } else {
904
            if (slirp_guestfwd(s, config->str,
905
                               config->flags & SLIRP_CFG_LEGACY) < 0)
906
                return -1;
907
        }
908
    }
909
#ifndef _WIN32
910
    if (!smb_export) {
911
        smb_export = legacy_smb_export;
912
    }
913
    if (smb_export) {
914
        if (slirp_smb(s, smb_export, smbsrv) < 0)
915
            return -1;
916
    }
917
#endif
918

    
919
    s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_SLIRP,
920
                                 vlan, NULL, model, name, NULL,
921
                                 slirp_receive, NULL, NULL,
922
                                 net_slirp_cleanup, s);
923
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
924
             "net=%s, restricted=%c", inet_ntoa(net), restricted ? 'y' : 'n');
925
    return 0;
926
}
927

    
928
static SlirpState *slirp_lookup(Monitor *mon, const char *vlan,
929
                                const char *stack)
930
{
931
    VLANClientState *vc;
932

    
933
    if (vlan) {
934
        vc = qemu_find_vlan_client_by_name(mon, strtol(vlan, NULL, 0), stack);
935
        if (!vc) {
936
            return NULL;
937
        }
938
        if (strcmp(vc->model, "user")) {
939
            monitor_printf(mon, "invalid device specified\n");
940
            return NULL;
941
        }
942
        return vc->opaque;
943
    } else {
944
        if (QTAILQ_EMPTY(&slirp_stacks)) {
945
            monitor_printf(mon, "user mode network stack not in use\n");
946
            return NULL;
947
        }
948
        return QTAILQ_FIRST(&slirp_stacks);
949
    }
950
}
951

    
952
void net_slirp_hostfwd_remove(Monitor *mon, const QDict *qdict)
953
{
954
    struct in_addr host_addr = { .s_addr = INADDR_ANY };
955
    int host_port;
956
    char buf[256] = "";
957
    const char *src_str, *p;
958
    SlirpState *s;
959
    int is_udp = 0;
960
    int err;
961
    const char *arg1 = qdict_get_str(qdict, "arg1");
962
    const char *arg2 = qdict_get_try_str(qdict, "arg2");
963
    const char *arg3 = qdict_get_try_str(qdict, "arg3");
964

    
965
    if (arg2) {
966
        s = slirp_lookup(mon, arg1, arg2);
967
        src_str = arg3;
968
    } else {
969
        s = slirp_lookup(mon, NULL, NULL);
970
        src_str = arg1;
971
    }
972
    if (!s) {
973
        return;
974
    }
975

    
976
    if (!src_str || !src_str[0])
977
        goto fail_syntax;
978

    
979
    p = src_str;
980
    get_str_sep(buf, sizeof(buf), &p, ':');
981

    
982
    if (!strcmp(buf, "tcp") || buf[0] == '\0') {
983
        is_udp = 0;
984
    } else if (!strcmp(buf, "udp")) {
985
        is_udp = 1;
986
    } else {
987
        goto fail_syntax;
988
    }
989

    
990
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
991
        goto fail_syntax;
992
    }
993
    if (buf[0] != '\0' && !inet_aton(buf, &host_addr)) {
994
        goto fail_syntax;
995
    }
996

    
997
    host_port = atoi(p);
998

    
999
    err = slirp_remove_hostfwd(QTAILQ_FIRST(&slirp_stacks)->slirp, is_udp,
1000
                               host_addr, host_port);
1001

    
1002
    monitor_printf(mon, "host forwarding rule for %s %s\n", src_str,
1003
                   err ? "removed" : "not found");
1004
    return;
1005

    
1006
 fail_syntax:
1007
    monitor_printf(mon, "invalid format\n");
1008
}
1009

    
1010
static int slirp_hostfwd(SlirpState *s, const char *redir_str,
1011
                         int legacy_format)
1012
{
1013
    struct in_addr host_addr = { .s_addr = INADDR_ANY };
1014
    struct in_addr guest_addr = { .s_addr = 0 };
1015
    int host_port, guest_port;
1016
    const char *p;
1017
    char buf[256];
1018
    int is_udp;
1019
    char *end;
1020

    
1021
    p = redir_str;
1022
    if (!p || get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1023
        goto fail_syntax;
1024
    }
1025
    if (!strcmp(buf, "tcp") || buf[0] == '\0') {
1026
        is_udp = 0;
1027
    } else if (!strcmp(buf, "udp")) {
1028
        is_udp = 1;
1029
    } else {
1030
        goto fail_syntax;
1031
    }
1032

    
1033
    if (!legacy_format) {
1034
        if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1035
            goto fail_syntax;
1036
        }
1037
        if (buf[0] != '\0' && !inet_aton(buf, &host_addr)) {
1038
            goto fail_syntax;
1039
        }
1040
    }
1041

    
1042
    if (get_str_sep(buf, sizeof(buf), &p, legacy_format ? ':' : '-') < 0) {
1043
        goto fail_syntax;
1044
    }
1045
    host_port = strtol(buf, &end, 0);
1046
    if (*end != '\0' || host_port < 1 || host_port > 65535) {
1047
        goto fail_syntax;
1048
    }
1049

    
1050
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1051
        goto fail_syntax;
1052
    }
1053
    if (buf[0] != '\0' && !inet_aton(buf, &guest_addr)) {
1054
        goto fail_syntax;
1055
    }
1056

    
1057
    guest_port = strtol(p, &end, 0);
1058
    if (*end != '\0' || guest_port < 1 || guest_port > 65535) {
1059
        goto fail_syntax;
1060
    }
1061

    
1062
    if (slirp_add_hostfwd(s->slirp, is_udp, host_addr, host_port, guest_addr,
1063
                          guest_port) < 0) {
1064
        qemu_error("could not set up host forwarding rule '%s'\n",
1065
                   redir_str);
1066
        return -1;
1067
    }
1068
    return 0;
1069

    
1070
 fail_syntax:
1071
    qemu_error("invalid host forwarding rule '%s'\n", redir_str);
1072
    return -1;
1073
}
1074

    
1075
void net_slirp_hostfwd_add(Monitor *mon, const QDict *qdict)
1076
{
1077
    const char *redir_str;
1078
    SlirpState *s;
1079
    const char *arg1 = qdict_get_str(qdict, "arg1");
1080
    const char *arg2 = qdict_get_try_str(qdict, "arg2");
1081
    const char *arg3 = qdict_get_try_str(qdict, "arg3");
1082

    
1083
    if (arg2) {
1084
        s = slirp_lookup(mon, arg1, arg2);
1085
        redir_str = arg3;
1086
    } else {
1087
        s = slirp_lookup(mon, NULL, NULL);
1088
        redir_str = arg1;
1089
    }
1090
    if (s) {
1091
        slirp_hostfwd(s, redir_str, 0);
1092
    }
1093

    
1094
}
1095

    
1096
int net_slirp_redir(const char *redir_str)
1097
{
1098
    struct slirp_config_str *config;
1099

    
1100
    if (QTAILQ_EMPTY(&slirp_stacks)) {
1101
        config = qemu_malloc(sizeof(*config));
1102
        pstrcpy(config->str, sizeof(config->str), redir_str);
1103
        config->flags = SLIRP_CFG_HOSTFWD | SLIRP_CFG_LEGACY;
1104
        config->next = slirp_configs;
1105
        slirp_configs = config;
1106
        return 0;
1107
    }
1108

    
1109
    return slirp_hostfwd(QTAILQ_FIRST(&slirp_stacks), redir_str, 1);
1110
}
1111

    
1112
#ifndef _WIN32
1113

    
1114
/* automatic user mode samba server configuration */
1115
static void slirp_smb_cleanup(SlirpState *s)
1116
{
1117
    char cmd[128];
1118

    
1119
    if (s->smb_dir[0] != '\0') {
1120
        snprintf(cmd, sizeof(cmd), "rm -rf %s", s->smb_dir);
1121
        system(cmd);
1122
        s->smb_dir[0] = '\0';
1123
    }
1124
}
1125

    
1126
static int slirp_smb(SlirpState* s, const char *exported_dir,
1127
                     struct in_addr vserver_addr)
1128
{
1129
    static int instance;
1130
    char smb_conf[128];
1131
    char smb_cmdline[128];
1132
    FILE *f;
1133

    
1134
    snprintf(s->smb_dir, sizeof(s->smb_dir), "/tmp/qemu-smb.%ld-%d",
1135
             (long)getpid(), instance++);
1136
    if (mkdir(s->smb_dir, 0700) < 0) {
1137
        qemu_error("could not create samba server dir '%s'\n", s->smb_dir);
1138
        return -1;
1139
    }
1140
    snprintf(smb_conf, sizeof(smb_conf), "%s/%s", s->smb_dir, "smb.conf");
1141

    
1142
    f = fopen(smb_conf, "w");
1143
    if (!f) {
1144
        slirp_smb_cleanup(s);
1145
        qemu_error("could not create samba server configuration file '%s'\n",
1146
                   smb_conf);
1147
        return -1;
1148
    }
1149
    fprintf(f,
1150
            "[global]\n"
1151
            "private dir=%s\n"
1152
            "smb ports=0\n"
1153
            "socket address=127.0.0.1\n"
1154
            "pid directory=%s\n"
1155
            "lock directory=%s\n"
1156
            "log file=%s/log.smbd\n"
1157
            "smb passwd file=%s/smbpasswd\n"
1158
            "security = share\n"
1159
            "[qemu]\n"
1160
            "path=%s\n"
1161
            "read only=no\n"
1162
            "guest ok=yes\n",
1163
            s->smb_dir,
1164
            s->smb_dir,
1165
            s->smb_dir,
1166
            s->smb_dir,
1167
            s->smb_dir,
1168
            exported_dir
1169
            );
1170
    fclose(f);
1171

    
1172
    snprintf(smb_cmdline, sizeof(smb_cmdline), "%s -s %s",
1173
             SMBD_COMMAND, smb_conf);
1174

    
1175
    if (slirp_add_exec(s->slirp, 0, smb_cmdline, &vserver_addr, 139) < 0) {
1176
        slirp_smb_cleanup(s);
1177
        qemu_error("conflicting/invalid smbserver address\n");
1178
        return -1;
1179
    }
1180
    return 0;
1181
}
1182

    
1183
/* automatic user mode samba server configuration (legacy interface) */
1184
int net_slirp_smb(const char *exported_dir)
1185
{
1186
    struct in_addr vserver_addr = { .s_addr = 0 };
1187

    
1188
    if (legacy_smb_export) {
1189
        fprintf(stderr, "-smb given twice\n");
1190
        return -1;
1191
    }
1192
    legacy_smb_export = exported_dir;
1193
    if (!QTAILQ_EMPTY(&slirp_stacks)) {
1194
        return slirp_smb(QTAILQ_FIRST(&slirp_stacks), exported_dir,
1195
                         vserver_addr);
1196
    }
1197
    return 0;
1198
}
1199

    
1200
#endif /* !defined(_WIN32) */
1201

    
1202
struct GuestFwd {
1203
    CharDriverState *hd;
1204
    struct in_addr server;
1205
    int port;
1206
    Slirp *slirp;
1207
};
1208

    
1209
static int guestfwd_can_read(void *opaque)
1210
{
1211
    struct GuestFwd *fwd = opaque;
1212
    return slirp_socket_can_recv(fwd->slirp, fwd->server, fwd->port);
1213
}
1214

    
1215
static void guestfwd_read(void *opaque, const uint8_t *buf, int size)
1216
{
1217
    struct GuestFwd *fwd = opaque;
1218
    slirp_socket_recv(fwd->slirp, fwd->server, fwd->port, buf, size);
1219
}
1220

    
1221
static int slirp_guestfwd(SlirpState *s, const char *config_str,
1222
                          int legacy_format)
1223
{
1224
    struct in_addr server = { .s_addr = 0 };
1225
    struct GuestFwd *fwd;
1226
    const char *p;
1227
    char buf[128];
1228
    char *end;
1229
    int port;
1230

    
1231
    p = config_str;
1232
    if (legacy_format) {
1233
        if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1234
            goto fail_syntax;
1235
        }
1236
    } else {
1237
        if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1238
            goto fail_syntax;
1239
        }
1240
        if (strcmp(buf, "tcp") && buf[0] != '\0') {
1241
            goto fail_syntax;
1242
        }
1243
        if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1244
            goto fail_syntax;
1245
        }
1246
        if (buf[0] != '\0' && !inet_aton(buf, &server)) {
1247
            goto fail_syntax;
1248
        }
1249
        if (get_str_sep(buf, sizeof(buf), &p, '-') < 0) {
1250
            goto fail_syntax;
1251
        }
1252
    }
1253
    port = strtol(buf, &end, 10);
1254
    if (*end != '\0' || port < 1 || port > 65535) {
1255
        goto fail_syntax;
1256
    }
1257

    
1258
    fwd = qemu_malloc(sizeof(struct GuestFwd));
1259
    snprintf(buf, sizeof(buf), "guestfwd.tcp:%d", port);
1260
    fwd->hd = qemu_chr_open(buf, p, NULL);
1261
    if (!fwd->hd) {
1262
        qemu_error("could not open guest forwarding device '%s'\n", buf);
1263
        qemu_free(fwd);
1264
        return -1;
1265
    }
1266

    
1267
    if (slirp_add_exec(s->slirp, 3, fwd->hd, &server, port) < 0) {
1268
        qemu_error("conflicting/invalid host:port in guest forwarding "
1269
                   "rule '%s'\n", config_str);
1270
        qemu_free(fwd);
1271
        return -1;
1272
    }
1273
    fwd->server = server;
1274
    fwd->port = port;
1275
    fwd->slirp = s->slirp;
1276

    
1277
    qemu_chr_add_handlers(fwd->hd, guestfwd_can_read, guestfwd_read,
1278
                          NULL, fwd);
1279
    return 0;
1280

    
1281
 fail_syntax:
1282
    qemu_error("invalid guest forwarding rule '%s'\n", config_str);
1283
    return -1;
1284
}
1285

    
1286
void do_info_usernet(Monitor *mon)
1287
{
1288
    SlirpState *s;
1289

    
1290
    QTAILQ_FOREACH(s, &slirp_stacks, entry) {
1291
        monitor_printf(mon, "VLAN %d (%s):\n", s->vc->vlan->id, s->vc->name);
1292
        slirp_connection_info(s->slirp, mon);
1293
    }
1294
}
1295

    
1296
#endif /* CONFIG_SLIRP */
1297

    
1298
#if !defined(_WIN32) && !defined(_AIX)
1299

    
1300
/* Maximum GSO packet size (64k) plus plenty of room for
1301
 * the ethernet and virtio_net headers
1302
 */
1303
#define TAP_BUFSIZE (4096 + 65536)
1304

    
1305
typedef struct TAPState {
1306
    VLANClientState *vc;
1307
    int fd;
1308
    char down_script[1024];
1309
    char down_script_arg[128];
1310
    uint8_t buf[TAP_BUFSIZE];
1311
    unsigned int read_poll : 1;
1312
    unsigned int write_poll : 1;
1313
    unsigned int has_vnet_hdr : 1;
1314
    unsigned int using_vnet_hdr : 1;
1315
    unsigned int has_ufo: 1;
1316
} TAPState;
1317

    
1318
static int launch_script(const char *setup_script, const char *ifname, int fd);
1319

    
1320
static int tap_can_send(void *opaque);
1321
static void tap_send(void *opaque);
1322
static void tap_writable(void *opaque);
1323

    
1324
static void tap_update_fd_handler(TAPState *s)
1325
{
1326
    qemu_set_fd_handler2(s->fd,
1327
                         s->read_poll  ? tap_can_send : NULL,
1328
                         s->read_poll  ? tap_send     : NULL,
1329
                         s->write_poll ? tap_writable : NULL,
1330
                         s);
1331
}
1332

    
1333
static void tap_read_poll(TAPState *s, int enable)
1334
{
1335
    s->read_poll = !!enable;
1336
    tap_update_fd_handler(s);
1337
}
1338

    
1339
static void tap_write_poll(TAPState *s, int enable)
1340
{
1341
    s->write_poll = !!enable;
1342
    tap_update_fd_handler(s);
1343
}
1344

    
1345
static void tap_writable(void *opaque)
1346
{
1347
    TAPState *s = opaque;
1348

    
1349
    tap_write_poll(s, 0);
1350

    
1351
    qemu_flush_queued_packets(s->vc);
1352
}
1353

    
1354
static ssize_t tap_write_packet(TAPState *s, const struct iovec *iov, int iovcnt)
1355
{
1356
    ssize_t len;
1357

    
1358
    do {
1359
        len = writev(s->fd, iov, iovcnt);
1360
    } while (len == -1 && errno == EINTR);
1361

    
1362
    if (len == -1 && errno == EAGAIN) {
1363
        tap_write_poll(s, 1);
1364
        return 0;
1365
    }
1366

    
1367
    return len;
1368
}
1369

    
1370
static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov,
1371
                               int iovcnt)
1372
{
1373
    TAPState *s = vc->opaque;
1374
    const struct iovec *iovp = iov;
1375
    struct iovec iov_copy[iovcnt + 1];
1376
    struct virtio_net_hdr hdr = { 0, };
1377

    
1378
    if (s->has_vnet_hdr && !s->using_vnet_hdr) {
1379
        iov_copy[0].iov_base = &hdr;
1380
        iov_copy[0].iov_len =  sizeof(hdr);
1381
        memcpy(&iov_copy[1], iov, iovcnt * sizeof(*iov));
1382
        iovp = iov_copy;
1383
        iovcnt++;
1384
    }
1385

    
1386
    return tap_write_packet(s, iovp, iovcnt);
1387
}
1388

    
1389
static ssize_t tap_receive_raw(VLANClientState *vc, const uint8_t *buf, size_t size)
1390
{
1391
    TAPState *s = vc->opaque;
1392
    struct iovec iov[2];
1393
    int iovcnt = 0;
1394
    struct virtio_net_hdr hdr = { 0, };
1395

    
1396
    if (s->has_vnet_hdr) {
1397
        iov[iovcnt].iov_base = &hdr;
1398
        iov[iovcnt].iov_len  = sizeof(hdr);
1399
        iovcnt++;
1400
    }
1401

    
1402
    iov[iovcnt].iov_base = (char *)buf;
1403
    iov[iovcnt].iov_len  = size;
1404
    iovcnt++;
1405

    
1406
    return tap_write_packet(s, iov, iovcnt);
1407
}
1408

    
1409
static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1410
{
1411
    TAPState *s = vc->opaque;
1412
    struct iovec iov[1];
1413

    
1414
    if (s->has_vnet_hdr && !s->using_vnet_hdr) {
1415
        return tap_receive_raw(vc, buf, size);
1416
    }
1417

    
1418
    iov[0].iov_base = (char *)buf;
1419
    iov[0].iov_len  = size;
1420

    
1421
    return tap_write_packet(s, iov, 1);
1422
}
1423

    
1424
static int tap_can_send(void *opaque)
1425
{
1426
    TAPState *s = opaque;
1427

    
1428
    return qemu_can_send_packet(s->vc);
1429
}
1430

    
1431
#ifdef __sun__
1432
static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1433
{
1434
    struct strbuf sbuf;
1435
    int f = 0;
1436

    
1437
    sbuf.maxlen = maxlen;
1438
    sbuf.buf = (char *)buf;
1439

    
1440
    return getmsg(tapfd, NULL, &sbuf, &f) >= 0 ? sbuf.len : -1;
1441
}
1442
#else
1443
static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1444
{
1445
    return read(tapfd, buf, maxlen);
1446
}
1447
#endif
1448

    
1449
static void tap_send_completed(VLANClientState *vc, ssize_t len)
1450
{
1451
    TAPState *s = vc->opaque;
1452
    tap_read_poll(s, 1);
1453
}
1454

    
1455
static void tap_send(void *opaque)
1456
{
1457
    TAPState *s = opaque;
1458
    int size;
1459

    
1460
    do {
1461
        uint8_t *buf = s->buf;
1462

    
1463
        size = tap_read_packet(s->fd, s->buf, sizeof(s->buf));
1464
        if (size <= 0) {
1465
            break;
1466
        }
1467

    
1468
        if (s->has_vnet_hdr && !s->using_vnet_hdr) {
1469
            buf  += sizeof(struct virtio_net_hdr);
1470
            size -= sizeof(struct virtio_net_hdr);
1471
        }
1472

    
1473
        size = qemu_send_packet_async(s->vc, buf, size, tap_send_completed);
1474
        if (size == 0) {
1475
            tap_read_poll(s, 0);
1476
        }
1477
    } while (size > 0);
1478
}
1479

    
1480
/* sndbuf should be set to a value lower than the tx queue
1481
 * capacity of any destination network interface.
1482
 * Ethernet NICs generally have txqueuelen=1000, so 1Mb is
1483
 * a good default, given a 1500 byte MTU.
1484
 */
1485
#define TAP_DEFAULT_SNDBUF 1024*1024
1486

    
1487
static int tap_set_sndbuf(TAPState *s, QemuOpts *opts)
1488
{
1489
    int sndbuf;
1490

    
1491
    sndbuf = qemu_opt_get_size(opts, "sndbuf", TAP_DEFAULT_SNDBUF);
1492
    if (!sndbuf) {
1493
        sndbuf = INT_MAX;
1494
    }
1495

    
1496
    if (ioctl(s->fd, TUNSETSNDBUF, &sndbuf) == -1 && qemu_opt_get(opts, "sndbuf")) {
1497
        qemu_error("TUNSETSNDBUF ioctl failed: %s\n", strerror(errno));
1498
        return -1;
1499
    }
1500
    return 0;
1501
}
1502

    
1503
int tap_has_ufo(VLANClientState *vc)
1504
{
1505
    TAPState *s = vc->opaque;
1506

    
1507
    assert(vc->type == NET_CLIENT_TYPE_TAP);
1508

    
1509
    return s->has_ufo;
1510
}
1511

    
1512
int tap_has_vnet_hdr(VLANClientState *vc)
1513
{
1514
    TAPState *s = vc->opaque;
1515

    
1516
    assert(vc->type == NET_CLIENT_TYPE_TAP);
1517

    
1518
    return s->has_vnet_hdr;
1519
}
1520

    
1521
void tap_using_vnet_hdr(VLANClientState *vc, int using_vnet_hdr)
1522
{
1523
    TAPState *s = vc->opaque;
1524

    
1525
    using_vnet_hdr = using_vnet_hdr != 0;
1526

    
1527
    assert(vc->type == NET_CLIENT_TYPE_TAP);
1528
    assert(s->has_vnet_hdr == using_vnet_hdr);
1529

    
1530
    s->using_vnet_hdr = using_vnet_hdr;
1531
}
1532

    
1533
static int tap_probe_vnet_hdr(int fd)
1534
{
1535
    struct ifreq ifr;
1536

    
1537
    if (ioctl(fd, TUNGETIFF, &ifr) != 0) {
1538
        qemu_error("TUNGETIFF ioctl() failed: %s\n", strerror(errno));
1539
        return 0;
1540
    }
1541

    
1542
    return ifr.ifr_flags & IFF_VNET_HDR;
1543
}
1544

    
1545
void tap_set_offload(VLANClientState *vc, int csum, int tso4,
1546
                     int tso6, int ecn, int ufo)
1547
{
1548
    TAPState *s = vc->opaque;
1549
    unsigned int offload = 0;
1550

    
1551
    if (csum) {
1552
        offload |= TUN_F_CSUM;
1553
        if (tso4)
1554
            offload |= TUN_F_TSO4;
1555
        if (tso6)
1556
            offload |= TUN_F_TSO6;
1557
        if ((tso4 || tso6) && ecn)
1558
            offload |= TUN_F_TSO_ECN;
1559
        if (ufo)
1560
            offload |= TUN_F_UFO;
1561
    }
1562

    
1563
    if (ioctl(s->fd, TUNSETOFFLOAD, offload) != 0) {
1564
        offload &= ~TUN_F_UFO;
1565
        if (ioctl(s->fd, TUNSETOFFLOAD, offload) != 0) {
1566
            fprintf(stderr, "TUNSETOFFLOAD ioctl() failed: %s\n",
1567
                    strerror(errno));
1568
        }
1569
    }
1570
}
1571

    
1572
static void tap_cleanup(VLANClientState *vc)
1573
{
1574
    TAPState *s = vc->opaque;
1575

    
1576
    qemu_purge_queued_packets(vc);
1577

    
1578
    if (s->down_script[0])
1579
        launch_script(s->down_script, s->down_script_arg, s->fd);
1580

    
1581
    tap_read_poll(s, 0);
1582
    tap_write_poll(s, 0);
1583
    close(s->fd);
1584
    qemu_free(s);
1585
}
1586

    
1587
/* fd support */
1588

    
1589
static TAPState *net_tap_fd_init(VLANState *vlan,
1590
                                 const char *model,
1591
                                 const char *name,
1592
                                 int fd,
1593
                                 int vnet_hdr)
1594
{
1595
    TAPState *s;
1596
    unsigned int offload;
1597

    
1598
    s = qemu_mallocz(sizeof(TAPState));
1599
    s->fd = fd;
1600
    s->has_vnet_hdr = vnet_hdr != 0;
1601
    s->using_vnet_hdr = 0;
1602
    s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_TAP,
1603
                                 vlan, NULL, model, name, NULL,
1604
                                 tap_receive, tap_receive_raw,
1605
                                 tap_receive_iov, tap_cleanup, s);
1606
    s->has_ufo = 0;
1607
    /* Check if tap supports UFO */
1608
    offload = TUN_F_CSUM | TUN_F_UFO;
1609
    if (ioctl(s->fd, TUNSETOFFLOAD, offload) == 0)
1610
       s->has_ufo = 1;
1611
    tap_set_offload(s->vc, 0, 0, 0, 0, 0);
1612
    tap_read_poll(s, 1);
1613
    return s;
1614
}
1615

    
1616
#if defined (CONFIG_BSD) || defined (__FreeBSD_kernel__)
1617
static int tap_open(char *ifname, int ifname_size,
1618
                    int *vnet_hdr, int vnet_hdr_required)
1619
{
1620
    int fd;
1621
    char *dev;
1622
    struct stat s;
1623

    
1624
    TFR(fd = open("/dev/tap", O_RDWR));
1625
    if (fd < 0) {
1626
        fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
1627
        return -1;
1628
    }
1629

    
1630
    fstat(fd, &s);
1631
    dev = devname(s.st_rdev, S_IFCHR);
1632
    pstrcpy(ifname, ifname_size, dev);
1633

    
1634
    fcntl(fd, F_SETFL, O_NONBLOCK);
1635
    return fd;
1636
}
1637
#elif defined(__sun__)
1638
#define TUNNEWPPA       (('T'<<16) | 0x0001)
1639
/*
1640
 * Allocate TAP device, returns opened fd.
1641
 * Stores dev name in the first arg(must be large enough).
1642
 */
1643
static int tap_alloc(char *dev, size_t dev_size)
1644
{
1645
    int tap_fd, if_fd, ppa = -1;
1646
    static int ip_fd = 0;
1647
    char *ptr;
1648

    
1649
    static int arp_fd = 0;
1650
    int ip_muxid, arp_muxid;
1651
    struct strioctl  strioc_if, strioc_ppa;
1652
    int link_type = I_PLINK;;
1653
    struct lifreq ifr;
1654
    char actual_name[32] = "";
1655

    
1656
    memset(&ifr, 0x0, sizeof(ifr));
1657

    
1658
    if( *dev ){
1659
       ptr = dev;
1660
       while( *ptr && !qemu_isdigit((int)*ptr) ) ptr++;
1661
       ppa = atoi(ptr);
1662
    }
1663

    
1664
    /* Check if IP device was opened */
1665
    if( ip_fd )
1666
       close(ip_fd);
1667

    
1668
    TFR(ip_fd = open("/dev/udp", O_RDWR, 0));
1669
    if (ip_fd < 0) {
1670
       syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)");
1671
       return -1;
1672
    }
1673

    
1674
    TFR(tap_fd = open("/dev/tap", O_RDWR, 0));
1675
    if (tap_fd < 0) {
1676
       syslog(LOG_ERR, "Can't open /dev/tap");
1677
       return -1;
1678
    }
1679

    
1680
    /* Assign a new PPA and get its unit number. */
1681
    strioc_ppa.ic_cmd = TUNNEWPPA;
1682
    strioc_ppa.ic_timout = 0;
1683
    strioc_ppa.ic_len = sizeof(ppa);
1684
    strioc_ppa.ic_dp = (char *)&ppa;
1685
    if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0)
1686
       syslog (LOG_ERR, "Can't assign new interface");
1687

    
1688
    TFR(if_fd = open("/dev/tap", O_RDWR, 0));
1689
    if (if_fd < 0) {
1690
       syslog(LOG_ERR, "Can't open /dev/tap (2)");
1691
       return -1;
1692
    }
1693
    if(ioctl(if_fd, I_PUSH, "ip") < 0){
1694
       syslog(LOG_ERR, "Can't push IP module");
1695
       return -1;
1696
    }
1697

    
1698
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) < 0)
1699
        syslog(LOG_ERR, "Can't get flags\n");
1700

    
1701
    snprintf (actual_name, 32, "tap%d", ppa);
1702
    pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
1703

    
1704
    ifr.lifr_ppa = ppa;
1705
    /* Assign ppa according to the unit number returned by tun device */
1706

    
1707
    if (ioctl (if_fd, SIOCSLIFNAME, &ifr) < 0)
1708
        syslog (LOG_ERR, "Can't set PPA %d", ppa);
1709
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) <0)
1710
        syslog (LOG_ERR, "Can't get flags\n");
1711
    /* Push arp module to if_fd */
1712
    if (ioctl (if_fd, I_PUSH, "arp") < 0)
1713
        syslog (LOG_ERR, "Can't push ARP module (2)");
1714

    
1715
    /* Push arp module to ip_fd */
1716
    if (ioctl (ip_fd, I_POP, NULL) < 0)
1717
        syslog (LOG_ERR, "I_POP failed\n");
1718
    if (ioctl (ip_fd, I_PUSH, "arp") < 0)
1719
        syslog (LOG_ERR, "Can't push ARP module (3)\n");
1720
    /* Open arp_fd */
1721
    TFR(arp_fd = open ("/dev/tap", O_RDWR, 0));
1722
    if (arp_fd < 0)
1723
       syslog (LOG_ERR, "Can't open %s\n", "/dev/tap");
1724

    
1725
    /* Set ifname to arp */
1726
    strioc_if.ic_cmd = SIOCSLIFNAME;
1727
    strioc_if.ic_timout = 0;
1728
    strioc_if.ic_len = sizeof(ifr);
1729
    strioc_if.ic_dp = (char *)&ifr;
1730
    if (ioctl(arp_fd, I_STR, &strioc_if) < 0){
1731
        syslog (LOG_ERR, "Can't set ifname to arp\n");
1732
    }
1733

    
1734
    if((ip_muxid = ioctl(ip_fd, I_LINK, if_fd)) < 0){
1735
       syslog(LOG_ERR, "Can't link TAP device to IP");
1736
       return -1;
1737
    }
1738

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

    
1742
    close (if_fd);
1743

    
1744
    memset(&ifr, 0x0, sizeof(ifr));
1745
    pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
1746
    ifr.lifr_ip_muxid  = ip_muxid;
1747
    ifr.lifr_arp_muxid = arp_muxid;
1748

    
1749
    if (ioctl (ip_fd, SIOCSLIFMUXID, &ifr) < 0)
1750
    {
1751
      ioctl (ip_fd, I_PUNLINK , arp_muxid);
1752
      ioctl (ip_fd, I_PUNLINK, ip_muxid);
1753
      syslog (LOG_ERR, "Can't set multiplexor id");
1754
    }
1755

    
1756
    snprintf(dev, dev_size, "tap%d", ppa);
1757
    return tap_fd;
1758
}
1759

    
1760
static int tap_open(char *ifname, int ifname_size,
1761
                    int *vnet_hdr, int vnet_hdr_required)
1762
{
1763
    char  dev[10]="";
1764
    int fd;
1765
    if( (fd = tap_alloc(dev, sizeof(dev))) < 0 ){
1766
       fprintf(stderr, "Cannot allocate TAP device\n");
1767
       return -1;
1768
    }
1769
    pstrcpy(ifname, ifname_size, dev);
1770
    fcntl(fd, F_SETFL, O_NONBLOCK);
1771
    return fd;
1772
}
1773
#elif defined (_AIX)
1774
static int tap_open(char *ifname, int ifname_size,
1775
                    int *vnet_hdr, int vnet_hdr_required)
1776
{
1777
    fprintf (stderr, "no tap on AIX\n");
1778
    return -1;
1779
}
1780
#else
1781
static int tap_open(char *ifname, int ifname_size,
1782
                    int *vnet_hdr, int vnet_hdr_required)
1783
{
1784
    struct ifreq ifr;
1785
    int fd, ret;
1786

    
1787
    TFR(fd = open("/dev/net/tun", O_RDWR));
1788
    if (fd < 0) {
1789
        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
1790
        return -1;
1791
    }
1792
    memset(&ifr, 0, sizeof(ifr));
1793
    ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
1794

    
1795
    if (*vnet_hdr) {
1796
        unsigned int features;
1797

    
1798
        if (ioctl(fd, TUNGETFEATURES, &features) == 0 &&
1799
            features & IFF_VNET_HDR) {
1800
            *vnet_hdr = 1;
1801
            ifr.ifr_flags |= IFF_VNET_HDR;
1802
        }
1803

    
1804
        if (vnet_hdr_required && !*vnet_hdr) {
1805
            qemu_error("vnet_hdr=1 requested, but no kernel "
1806
                       "support for IFF_VNET_HDR available");
1807
            close(fd);
1808
            return -1;
1809
        }
1810
    }
1811

    
1812
    if (ifname[0] != '\0')
1813
        pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
1814
    else
1815
        pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
1816
    ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
1817
    if (ret != 0) {
1818
        fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
1819
        close(fd);
1820
        return -1;
1821
    }
1822
    pstrcpy(ifname, ifname_size, ifr.ifr_name);
1823
    fcntl(fd, F_SETFL, O_NONBLOCK);
1824
    return fd;
1825
}
1826
#endif
1827

    
1828
static int launch_script(const char *setup_script, const char *ifname, int fd)
1829
{
1830
    sigset_t oldmask, mask;
1831
    int pid, status;
1832
    char *args[3];
1833
    char **parg;
1834

    
1835
    sigemptyset(&mask);
1836
    sigaddset(&mask, SIGCHLD);
1837
    sigprocmask(SIG_BLOCK, &mask, &oldmask);
1838

    
1839
    /* try to launch network script */
1840
    pid = fork();
1841
    if (pid == 0) {
1842
        int open_max = sysconf(_SC_OPEN_MAX), i;
1843

    
1844
        for (i = 0; i < open_max; i++) {
1845
            if (i != STDIN_FILENO &&
1846
                i != STDOUT_FILENO &&
1847
                i != STDERR_FILENO &&
1848
                i != fd) {
1849
                close(i);
1850
            }
1851
        }
1852
        parg = args;
1853
        *parg++ = (char *)setup_script;
1854
        *parg++ = (char *)ifname;
1855
        *parg++ = NULL;
1856
        execv(setup_script, args);
1857
        _exit(1);
1858
    } else if (pid > 0) {
1859
        while (waitpid(pid, &status, 0) != pid) {
1860
            /* loop */
1861
        }
1862
        sigprocmask(SIG_SETMASK, &oldmask, NULL);
1863

    
1864
        if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
1865
            return 0;
1866
        }
1867
    }
1868
    fprintf(stderr, "%s: could not launch network script\n", setup_script);
1869
    return -1;
1870
}
1871

    
1872
static int net_tap_init(QemuOpts *opts, int *vnet_hdr)
1873
{
1874
    int fd, vnet_hdr_required;
1875
    char ifname[128] = {0,};
1876
    const char *setup_script;
1877

    
1878
    if (qemu_opt_get(opts, "ifname")) {
1879
        pstrcpy(ifname, sizeof(ifname), qemu_opt_get(opts, "ifname"));
1880
    }
1881

    
1882
    *vnet_hdr = qemu_opt_get_bool(opts, "vnet_hdr", 1);
1883
    if (qemu_opt_get(opts, "vnet_hdr")) {
1884
        vnet_hdr_required = *vnet_hdr;
1885
    } else {
1886
        vnet_hdr_required = 0;
1887
    }
1888

    
1889
    TFR(fd = tap_open(ifname, sizeof(ifname), vnet_hdr, vnet_hdr_required));
1890
    if (fd < 0) {
1891
        return -1;
1892
    }
1893

    
1894
    setup_script = qemu_opt_get(opts, "script");
1895
    if (setup_script &&
1896
        setup_script[0] != '\0' &&
1897
        strcmp(setup_script, "no") != 0 &&
1898
        launch_script(setup_script, ifname, fd)) {
1899
        close(fd);
1900
        return -1;
1901
    }
1902

    
1903
    qemu_opt_set(opts, "ifname", ifname);
1904

    
1905
    return fd;
1906
}
1907

    
1908
#endif /* !defined(_WIN32) && !defined(_AIX) */
1909

    
1910
#if defined(CONFIG_VDE)
1911
typedef struct VDEState {
1912
    VLANClientState *vc;
1913
    VDECONN *vde;
1914
} VDEState;
1915

    
1916
static void vde_to_qemu(void *opaque)
1917
{
1918
    VDEState *s = opaque;
1919
    uint8_t buf[4096];
1920
    int size;
1921

    
1922
    size = vde_recv(s->vde, (char *)buf, sizeof(buf), 0);
1923
    if (size > 0) {
1924
        qemu_send_packet(s->vc, buf, size);
1925
    }
1926
}
1927

    
1928
static ssize_t vde_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1929
{
1930
    VDEState *s = vc->opaque;
1931
    ssize_t ret;
1932

    
1933
    do {
1934
      ret = vde_send(s->vde, (const char *)buf, size, 0);
1935
    } while (ret < 0 && errno == EINTR);
1936

    
1937
    return ret;
1938
}
1939

    
1940
static void vde_cleanup(VLANClientState *vc)
1941
{
1942
    VDEState *s = vc->opaque;
1943
    qemu_set_fd_handler(vde_datafd(s->vde), NULL, NULL, NULL);
1944
    vde_close(s->vde);
1945
    qemu_free(s);
1946
}
1947

    
1948
static int net_vde_init(VLANState *vlan, const char *model,
1949
                        const char *name, const char *sock,
1950
                        int port, const char *group, int mode)
1951
{
1952
    VDEState *s;
1953
    char *init_group = (char *)group;
1954
    char *init_sock = (char *)sock;
1955

    
1956
    struct vde_open_args args = {
1957
        .port = port,
1958
        .group = init_group,
1959
        .mode = mode,
1960
    };
1961

    
1962
    s = qemu_mallocz(sizeof(VDEState));
1963
    s->vde = vde_open(init_sock, (char *)"QEMU", &args);
1964
    if (!s->vde){
1965
        free(s);
1966
        return -1;
1967
    }
1968
    s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_VDE,
1969
                                 vlan, NULL, model, name, NULL,
1970
                                 vde_receive, NULL, NULL,
1971
                                 vde_cleanup, s);
1972
    qemu_set_fd_handler(vde_datafd(s->vde), vde_to_qemu, NULL, s);
1973
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), "sock=%s,fd=%d",
1974
             sock, vde_datafd(s->vde));
1975
    return 0;
1976
}
1977
#endif
1978

    
1979
/* network connection */
1980
typedef struct NetSocketState {
1981
    VLANClientState *vc;
1982
    int fd;
1983
    int state; /* 0 = getting length, 1 = getting data */
1984
    unsigned int index;
1985
    unsigned int packet_len;
1986
    uint8_t buf[4096];
1987
    struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
1988
} NetSocketState;
1989

    
1990
typedef struct NetSocketListenState {
1991
    VLANState *vlan;
1992
    char *model;
1993
    char *name;
1994
    int fd;
1995
} NetSocketListenState;
1996

    
1997
/* XXX: we consider we can send the whole packet without blocking */
1998
static ssize_t net_socket_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1999
{
2000
    NetSocketState *s = vc->opaque;
2001
    uint32_t len;
2002
    len = htonl(size);
2003

    
2004
    send_all(s->fd, (const uint8_t *)&len, sizeof(len));
2005
    return send_all(s->fd, buf, size);
2006
}
2007

    
2008
static ssize_t net_socket_receive_dgram(VLANClientState *vc, const uint8_t *buf, size_t size)
2009
{
2010
    NetSocketState *s = vc->opaque;
2011

    
2012
    return sendto(s->fd, (const void *)buf, size, 0,
2013
                  (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
2014
}
2015

    
2016
static void net_socket_send(void *opaque)
2017
{
2018
    NetSocketState *s = opaque;
2019
    int size, err;
2020
    unsigned l;
2021
    uint8_t buf1[4096];
2022
    const uint8_t *buf;
2023

    
2024
    size = recv(s->fd, (void *)buf1, sizeof(buf1), 0);
2025
    if (size < 0) {
2026
        err = socket_error();
2027
        if (err != EWOULDBLOCK)
2028
            goto eoc;
2029
    } else if (size == 0) {
2030
        /* end of connection */
2031
    eoc:
2032
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
2033
        closesocket(s->fd);
2034
        return;
2035
    }
2036
    buf = buf1;
2037
    while (size > 0) {
2038
        /* reassemble a packet from the network */
2039
        switch(s->state) {
2040
        case 0:
2041
            l = 4 - s->index;
2042
            if (l > size)
2043
                l = size;
2044
            memcpy(s->buf + s->index, buf, l);
2045
            buf += l;
2046
            size -= l;
2047
            s->index += l;
2048
            if (s->index == 4) {
2049
                /* got length */
2050
                s->packet_len = ntohl(*(uint32_t *)s->buf);
2051
                s->index = 0;
2052
                s->state = 1;
2053
            }
2054
            break;
2055
        case 1:
2056
            l = s->packet_len - s->index;
2057
            if (l > size)
2058
                l = size;
2059
            if (s->index + l <= sizeof(s->buf)) {
2060
                memcpy(s->buf + s->index, buf, l);
2061
            } else {
2062
                fprintf(stderr, "serious error: oversized packet received,"
2063
                    "connection terminated.\n");
2064
                s->state = 0;
2065
                goto eoc;
2066
            }
2067

    
2068
            s->index += l;
2069
            buf += l;
2070
            size -= l;
2071
            if (s->index >= s->packet_len) {
2072
                qemu_send_packet(s->vc, s->buf, s->packet_len);
2073
                s->index = 0;
2074
                s->state = 0;
2075
            }
2076
            break;
2077
        }
2078
    }
2079
}
2080

    
2081
static void net_socket_send_dgram(void *opaque)
2082
{
2083
    NetSocketState *s = opaque;
2084
    int size;
2085

    
2086
    size = recv(s->fd, (void *)s->buf, sizeof(s->buf), 0);
2087
    if (size < 0)
2088
        return;
2089
    if (size == 0) {
2090
        /* end of connection */
2091
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
2092
        return;
2093
    }
2094
    qemu_send_packet(s->vc, s->buf, size);
2095
}
2096

    
2097
static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
2098
{
2099
    struct ip_mreq imr;
2100
    int fd;
2101
    int val, ret;
2102
    if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
2103
        fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
2104
                inet_ntoa(mcastaddr->sin_addr),
2105
                (int)ntohl(mcastaddr->sin_addr.s_addr));
2106
        return -1;
2107

    
2108
    }
2109
    fd = socket(PF_INET, SOCK_DGRAM, 0);
2110
    if (fd < 0) {
2111
        perror("socket(PF_INET, SOCK_DGRAM)");
2112
        return -1;
2113
    }
2114

    
2115
    val = 1;
2116
    ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
2117
                   (const char *)&val, sizeof(val));
2118
    if (ret < 0) {
2119
        perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
2120
        goto fail;
2121
    }
2122

    
2123
    ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
2124
    if (ret < 0) {
2125
        perror("bind");
2126
        goto fail;
2127
    }
2128

    
2129
    /* Add host to multicast group */
2130
    imr.imr_multiaddr = mcastaddr->sin_addr;
2131
    imr.imr_interface.s_addr = htonl(INADDR_ANY);
2132

    
2133
    ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
2134
                     (const char *)&imr, sizeof(struct ip_mreq));
2135
    if (ret < 0) {
2136
        perror("setsockopt(IP_ADD_MEMBERSHIP)");
2137
        goto fail;
2138
    }
2139

    
2140
    /* Force mcast msgs to loopback (eg. several QEMUs in same host */
2141
    val = 1;
2142
    ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
2143
                   (const char *)&val, sizeof(val));
2144
    if (ret < 0) {
2145
        perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
2146
        goto fail;
2147
    }
2148

    
2149
    socket_set_nonblock(fd);
2150
    return fd;
2151
fail:
2152
    if (fd >= 0)
2153
        closesocket(fd);
2154
    return -1;
2155
}
2156

    
2157
static void net_socket_cleanup(VLANClientState *vc)
2158
{
2159
    NetSocketState *s = vc->opaque;
2160
    qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
2161
    close(s->fd);
2162
    qemu_free(s);
2163
}
2164

    
2165
static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan,
2166
                                                const char *model,
2167
                                                const char *name,
2168
                                                int fd, int is_connected)
2169
{
2170
    struct sockaddr_in saddr;
2171
    int newfd;
2172
    socklen_t saddr_len;
2173
    NetSocketState *s;
2174

    
2175
    /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
2176
     * Because this may be "shared" socket from a "master" process, datagrams would be recv()
2177
     * by ONLY ONE process: we must "clone" this dgram socket --jjo
2178
     */
2179

    
2180
    if (is_connected) {
2181
        if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
2182
            /* must be bound */
2183
            if (saddr.sin_addr.s_addr==0) {
2184
                fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
2185
                        fd);
2186
                return NULL;
2187
            }
2188
            /* clone dgram socket */
2189
            newfd = net_socket_mcast_create(&saddr);
2190
            if (newfd < 0) {
2191
                /* error already reported by net_socket_mcast_create() */
2192
                close(fd);
2193
                return NULL;
2194
            }
2195
            /* clone newfd to fd, close newfd */
2196
            dup2(newfd, fd);
2197
            close(newfd);
2198

    
2199
        } else {
2200
            fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
2201
                    fd, strerror(errno));
2202
            return NULL;
2203
        }
2204
    }
2205

    
2206
    s = qemu_mallocz(sizeof(NetSocketState));
2207
    s->fd = fd;
2208

    
2209
    s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_SOCKET,
2210
                                 vlan, NULL, model, name, NULL,
2211
                                 net_socket_receive_dgram, NULL, NULL,
2212
                                 net_socket_cleanup, s);
2213
    qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
2214

    
2215
    /* mcast: save bound address as dst */
2216
    if (is_connected) s->dgram_dst=saddr;
2217

    
2218
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2219
            "socket: fd=%d (%s mcast=%s:%d)",
2220
            fd, is_connected? "cloned" : "",
2221
            inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2222
    return s;
2223
}
2224

    
2225
static void net_socket_connect(void *opaque)
2226
{
2227
    NetSocketState *s = opaque;
2228
    qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
2229
}
2230

    
2231
static NetSocketState *net_socket_fd_init_stream(VLANState *vlan,
2232
                                                 const char *model,
2233
                                                 const char *name,
2234
                                                 int fd, int is_connected)
2235
{
2236
    NetSocketState *s;
2237
    s = qemu_mallocz(sizeof(NetSocketState));
2238
    s->fd = fd;
2239
    s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_SOCKET,
2240
                                 vlan, NULL, model, name, NULL,
2241
                                 net_socket_receive, NULL, NULL,
2242
                                 net_socket_cleanup, s);
2243
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2244
             "socket: fd=%d", fd);
2245
    if (is_connected) {
2246
        net_socket_connect(s);
2247
    } else {
2248
        qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
2249
    }
2250
    return s;
2251
}
2252

    
2253
static NetSocketState *net_socket_fd_init(VLANState *vlan,
2254
                                          const char *model, const char *name,
2255
                                          int fd, int is_connected)
2256
{
2257
    int so_type = -1, optlen=sizeof(so_type);
2258

    
2259
    if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type,
2260
        (socklen_t *)&optlen)< 0) {
2261
        fprintf(stderr, "qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n", fd);
2262
        return NULL;
2263
    }
2264
    switch(so_type) {
2265
    case SOCK_DGRAM:
2266
        return net_socket_fd_init_dgram(vlan, model, name, fd, is_connected);
2267
    case SOCK_STREAM:
2268
        return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
2269
    default:
2270
        /* who knows ... this could be a eg. a pty, do warn and continue as stream */
2271
        fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
2272
        return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
2273
    }
2274
    return NULL;
2275
}
2276

    
2277
static void net_socket_accept(void *opaque)
2278
{
2279
    NetSocketListenState *s = opaque;
2280
    NetSocketState *s1;
2281
    struct sockaddr_in saddr;
2282
    socklen_t len;
2283
    int fd;
2284

    
2285
    for(;;) {
2286
        len = sizeof(saddr);
2287
        fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
2288
        if (fd < 0 && errno != EINTR) {
2289
            return;
2290
        } else if (fd >= 0) {
2291
            break;
2292
        }
2293
    }
2294
    s1 = net_socket_fd_init(s->vlan, s->model, s->name, fd, 1);
2295
    if (!s1) {
2296
        closesocket(fd);
2297
    } else {
2298
        snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
2299
                 "socket: connection from %s:%d",
2300
                 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2301
    }
2302
}
2303

    
2304
static int net_socket_listen_init(VLANState *vlan,
2305
                                  const char *model,
2306
                                  const char *name,
2307
                                  const char *host_str)
2308
{
2309
    NetSocketListenState *s;
2310
    int fd, val, ret;
2311
    struct sockaddr_in saddr;
2312

    
2313
    if (parse_host_port(&saddr, host_str) < 0)
2314
        return -1;
2315

    
2316
    s = qemu_mallocz(sizeof(NetSocketListenState));
2317

    
2318
    fd = socket(PF_INET, SOCK_STREAM, 0);
2319
    if (fd < 0) {
2320
        perror("socket");
2321
        return -1;
2322
    }
2323
    socket_set_nonblock(fd);
2324

    
2325
    /* allow fast reuse */
2326
    val = 1;
2327
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
2328

    
2329
    ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2330
    if (ret < 0) {
2331
        perror("bind");
2332
        return -1;
2333
    }
2334
    ret = listen(fd, 0);
2335
    if (ret < 0) {
2336
        perror("listen");
2337
        return -1;
2338
    }
2339
    s->vlan = vlan;
2340
    s->model = qemu_strdup(model);
2341
    s->name = name ? qemu_strdup(name) : NULL;
2342
    s->fd = fd;
2343
    qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
2344
    return 0;
2345
}
2346

    
2347
static int net_socket_connect_init(VLANState *vlan,
2348
                                   const char *model,
2349
                                   const char *name,
2350
                                   const char *host_str)
2351
{
2352
    NetSocketState *s;
2353
    int fd, connected, ret, err;
2354
    struct sockaddr_in saddr;
2355

    
2356
    if (parse_host_port(&saddr, host_str) < 0)
2357
        return -1;
2358

    
2359
    fd = socket(PF_INET, SOCK_STREAM, 0);
2360
    if (fd < 0) {
2361
        perror("socket");
2362
        return -1;
2363
    }
2364
    socket_set_nonblock(fd);
2365

    
2366
    connected = 0;
2367
    for(;;) {
2368
        ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2369
        if (ret < 0) {
2370
            err = socket_error();
2371
            if (err == EINTR || err == EWOULDBLOCK) {
2372
            } else if (err == EINPROGRESS) {
2373
                break;
2374
#ifdef _WIN32
2375
            } else if (err == WSAEALREADY) {
2376
                break;
2377
#endif
2378
            } else {
2379
                perror("connect");
2380
                closesocket(fd);
2381
                return -1;
2382
            }
2383
        } else {
2384
            connected = 1;
2385
            break;
2386
        }
2387
    }
2388
    s = net_socket_fd_init(vlan, model, name, fd, connected);
2389
    if (!s)
2390
        return -1;
2391
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2392
             "socket: connect to %s:%d",
2393
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2394
    return 0;
2395
}
2396

    
2397
static int net_socket_mcast_init(VLANState *vlan,
2398
                                 const char *model,
2399
                                 const char *name,
2400
                                 const char *host_str)
2401
{
2402
    NetSocketState *s;
2403
    int fd;
2404
    struct sockaddr_in saddr;
2405

    
2406
    if (parse_host_port(&saddr, host_str) < 0)
2407
        return -1;
2408

    
2409

    
2410
    fd = net_socket_mcast_create(&saddr);
2411
    if (fd < 0)
2412
        return -1;
2413

    
2414
    s = net_socket_fd_init(vlan, model, name, fd, 0);
2415
    if (!s)
2416
        return -1;
2417

    
2418
    s->dgram_dst = saddr;
2419

    
2420
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2421
             "socket: mcast=%s:%d",
2422
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2423
    return 0;
2424

    
2425
}
2426

    
2427
typedef struct DumpState {
2428
    VLANClientState *pcap_vc;
2429
    int fd;
2430
    int pcap_caplen;
2431
} DumpState;
2432

    
2433
#define PCAP_MAGIC 0xa1b2c3d4
2434

    
2435
struct pcap_file_hdr {
2436
    uint32_t magic;
2437
    uint16_t version_major;
2438
    uint16_t version_minor;
2439
    int32_t thiszone;
2440
    uint32_t sigfigs;
2441
    uint32_t snaplen;
2442
    uint32_t linktype;
2443
};
2444

    
2445
struct pcap_sf_pkthdr {
2446
    struct {
2447
        int32_t tv_sec;
2448
        int32_t tv_usec;
2449
    } ts;
2450
    uint32_t caplen;
2451
    uint32_t len;
2452
};
2453

    
2454
static ssize_t dump_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
2455
{
2456
    DumpState *s = vc->opaque;
2457
    struct pcap_sf_pkthdr hdr;
2458
    int64_t ts;
2459
    int caplen;
2460

    
2461
    /* Early return in case of previous error. */
2462
    if (s->fd < 0) {
2463
        return size;
2464
    }
2465

    
2466
    ts = muldiv64(qemu_get_clock(vm_clock), 1000000, get_ticks_per_sec());
2467
    caplen = size > s->pcap_caplen ? s->pcap_caplen : size;
2468

    
2469
    hdr.ts.tv_sec = ts / 1000000;
2470
    hdr.ts.tv_usec = ts % 1000000;
2471
    hdr.caplen = caplen;
2472
    hdr.len = size;
2473
    if (write(s->fd, &hdr, sizeof(hdr)) != sizeof(hdr) ||
2474
        write(s->fd, buf, caplen) != caplen) {
2475
        qemu_log("-net dump write error - stop dump\n");
2476
        close(s->fd);
2477
        s->fd = -1;
2478
    }
2479

    
2480
    return size;
2481
}
2482

    
2483
static void net_dump_cleanup(VLANClientState *vc)
2484
{
2485
    DumpState *s = vc->opaque;
2486

    
2487
    close(s->fd);
2488
    qemu_free(s);
2489
}
2490

    
2491
static int net_dump_init(VLANState *vlan, const char *device,
2492
                         const char *name, const char *filename, int len)
2493
{
2494
    struct pcap_file_hdr hdr;
2495
    DumpState *s;
2496

    
2497
    s = qemu_malloc(sizeof(DumpState));
2498

    
2499
    s->fd = open(filename, O_CREAT | O_WRONLY | O_BINARY, 0644);
2500
    if (s->fd < 0) {
2501
        qemu_error("-net dump: can't open %s\n", filename);
2502
        return -1;
2503
    }
2504

    
2505
    s->pcap_caplen = len;
2506

    
2507
    hdr.magic = PCAP_MAGIC;
2508
    hdr.version_major = 2;
2509
    hdr.version_minor = 4;
2510
    hdr.thiszone = 0;
2511
    hdr.sigfigs = 0;
2512
    hdr.snaplen = s->pcap_caplen;
2513
    hdr.linktype = 1;
2514

    
2515
    if (write(s->fd, &hdr, sizeof(hdr)) < sizeof(hdr)) {
2516
        qemu_error("-net dump write error: %s\n", strerror(errno));
2517
        close(s->fd);
2518
        qemu_free(s);
2519
        return -1;
2520
    }
2521

    
2522
    s->pcap_vc = qemu_new_vlan_client(NET_CLIENT_TYPE_DUMP,
2523
                                      vlan, NULL, device, name, NULL,
2524
                                      dump_receive, NULL, NULL,
2525
                                      net_dump_cleanup, s);
2526
    snprintf(s->pcap_vc->info_str, sizeof(s->pcap_vc->info_str),
2527
             "dump to %s (len=%d)", filename, len);
2528
    return 0;
2529
}
2530

    
2531
/* find or alloc a new VLAN */
2532
VLANState *qemu_find_vlan(int id, int allocate)
2533
{
2534
    VLANState *vlan;
2535

    
2536
    QTAILQ_FOREACH(vlan, &vlans, next) {
2537
        if (vlan->id == id) {
2538
            return vlan;
2539
        }
2540
    }
2541

    
2542
    if (!allocate) {
2543
        return NULL;
2544
    }
2545

    
2546
    vlan = qemu_mallocz(sizeof(VLANState));
2547
    vlan->id = id;
2548
    QTAILQ_INIT(&vlan->clients);
2549

    
2550
    vlan->send_queue = qemu_new_net_queue(qemu_vlan_deliver_packet,
2551
                                          qemu_vlan_deliver_packet_iov,
2552
                                          vlan);
2553

    
2554
    QTAILQ_INSERT_TAIL(&vlans, vlan, next);
2555

    
2556
    return vlan;
2557
}
2558

    
2559
VLANClientState *qemu_find_netdev(const char *id)
2560
{
2561
    VLANClientState *vc;
2562

    
2563
    QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
2564
        if (!strcmp(vc->name, id)) {
2565
            return vc;
2566
        }
2567
    }
2568

    
2569
    return NULL;
2570
}
2571

    
2572
static int nic_get_free_idx(void)
2573
{
2574
    int index;
2575

    
2576
    for (index = 0; index < MAX_NICS; index++)
2577
        if (!nd_table[index].used)
2578
            return index;
2579
    return -1;
2580
}
2581

    
2582
int qemu_show_nic_models(const char *arg, const char *const *models)
2583
{
2584
    int i;
2585

    
2586
    if (!arg || strcmp(arg, "?"))
2587
        return 0;
2588

    
2589
    fprintf(stderr, "qemu: Supported NIC models: ");
2590
    for (i = 0 ; models[i]; i++)
2591
        fprintf(stderr, "%s%c", models[i], models[i+1] ? ',' : '\n');
2592
    return 1;
2593
}
2594

    
2595
void qemu_check_nic_model(NICInfo *nd, const char *model)
2596
{
2597
    const char *models[2];
2598

    
2599
    models[0] = model;
2600
    models[1] = NULL;
2601

    
2602
    if (qemu_show_nic_models(nd->model, models))
2603
        exit(0);
2604
    if (qemu_find_nic_model(nd, models, model) < 0)
2605
        exit(1);
2606
}
2607

    
2608
int qemu_find_nic_model(NICInfo *nd, const char * const *models,
2609
                        const char *default_model)
2610
{
2611
    int i;
2612

    
2613
    if (!nd->model)
2614
        nd->model = qemu_strdup(default_model);
2615

    
2616
    for (i = 0 ; models[i]; i++) {
2617
        if (strcmp(nd->model, models[i]) == 0)
2618
            return i;
2619
    }
2620

    
2621
    qemu_error("qemu: Unsupported NIC model: %s\n", nd->model);
2622
    return -1;
2623
}
2624

    
2625
static int net_handle_fd_param(Monitor *mon, const char *param)
2626
{
2627
    if (!qemu_isdigit(param[0])) {
2628
        int fd;
2629

    
2630
        fd = monitor_get_fd(mon, param);
2631
        if (fd == -1) {
2632
            qemu_error("No file descriptor named %s found", param);
2633
            return -1;
2634
        }
2635

    
2636
        return fd;
2637
    } else {
2638
        return strtol(param, NULL, 0);
2639
    }
2640
}
2641

    
2642
static int net_init_nic(QemuOpts *opts,
2643
                        Monitor *mon,
2644
                        const char *name,
2645
                        VLANState *vlan)
2646
{
2647
    int idx;
2648
    NICInfo *nd;
2649
    const char *netdev;
2650

    
2651
    idx = nic_get_free_idx();
2652
    if (idx == -1 || nb_nics >= MAX_NICS) {
2653
        qemu_error("Too Many NICs\n");
2654
        return -1;
2655
    }
2656

    
2657
    nd = &nd_table[idx];
2658

    
2659
    memset(nd, 0, sizeof(*nd));
2660

    
2661
    if ((netdev = qemu_opt_get(opts, "netdev"))) {
2662
        nd->netdev = qemu_find_netdev(netdev);
2663
        if (!nd->netdev) {
2664
            qemu_error("netdev '%s' not found\n", netdev);
2665
            return -1;
2666
        }
2667
    } else {
2668
        assert(vlan);
2669
        nd->vlan = vlan;
2670
    }
2671
    if (name) {
2672
        nd->name = qemu_strdup(name);
2673
    }
2674
    if (qemu_opt_get(opts, "model")) {
2675
        nd->model = qemu_strdup(qemu_opt_get(opts, "model"));
2676
    }
2677
    if (qemu_opt_get(opts, "addr")) {
2678
        nd->devaddr = qemu_strdup(qemu_opt_get(opts, "addr"));
2679
    }
2680

    
2681
    nd->macaddr[0] = 0x52;
2682
    nd->macaddr[1] = 0x54;
2683
    nd->macaddr[2] = 0x00;
2684
    nd->macaddr[3] = 0x12;
2685
    nd->macaddr[4] = 0x34;
2686
    nd->macaddr[5] = 0x56 + idx;
2687

    
2688
    if (qemu_opt_get(opts, "macaddr") &&
2689
        parse_macaddr(nd->macaddr, qemu_opt_get(opts, "macaddr")) < 0) {
2690
        qemu_error("invalid syntax for ethernet address\n");
2691
        return -1;
2692
    }
2693

    
2694
    nd->nvectors = qemu_opt_get_number(opts, "vectors", NIC_NVECTORS_UNSPECIFIED);
2695
    if (nd->nvectors != NIC_NVECTORS_UNSPECIFIED &&
2696
        (nd->nvectors < 0 || nd->nvectors > 0x7ffffff)) {
2697
        qemu_error("invalid # of vectors: %d\n", nd->nvectors);
2698
        return -1;
2699
    }
2700

    
2701
    nd->used = 1;
2702
    if (vlan) {
2703
        nd->vlan->nb_guest_devs++;
2704
    }
2705
    nb_nics++;
2706

    
2707
    return idx;
2708
}
2709

    
2710
#if defined(CONFIG_SLIRP)
2711
static int net_init_slirp_configs(const char *name, const char *value, void *opaque)
2712
{
2713
    struct slirp_config_str *config;
2714

    
2715
    if (strcmp(name, "hostfwd") != 0 && strcmp(name, "guestfwd") != 0) {
2716
        return 0;
2717
    }
2718

    
2719
    config = qemu_mallocz(sizeof(*config));
2720

    
2721
    pstrcpy(config->str, sizeof(config->str), value);
2722

    
2723
    if (!strcmp(name, "hostfwd")) {
2724
        config->flags = SLIRP_CFG_HOSTFWD;
2725
    }
2726

    
2727
    config->next = slirp_configs;
2728
    slirp_configs = config;
2729

    
2730
    return 0;
2731
}
2732

    
2733
static int net_init_slirp(QemuOpts *opts,
2734
                          Monitor *mon,
2735
                          const char *name,
2736
                          VLANState *vlan)
2737
{
2738
    struct slirp_config_str *config;
2739
    const char *vhost;
2740
    const char *vhostname;
2741
    const char *vdhcp_start;
2742
    const char *vnamesrv;
2743
    const char *tftp_export;
2744
    const char *bootfile;
2745
    const char *smb_export;
2746
    const char *vsmbsrv;
2747
    char *vnet = NULL;
2748
    int restricted = 0;
2749
    int ret;
2750

    
2751
    vhost       = qemu_opt_get(opts, "host");
2752
    vhostname   = qemu_opt_get(opts, "hostname");
2753
    vdhcp_start = qemu_opt_get(opts, "dhcpstart");
2754
    vnamesrv    = qemu_opt_get(opts, "dns");
2755
    tftp_export = qemu_opt_get(opts, "tftp");
2756
    bootfile    = qemu_opt_get(opts, "bootfile");
2757
    smb_export  = qemu_opt_get(opts, "smb");
2758
    vsmbsrv     = qemu_opt_get(opts, "smbserver");
2759

    
2760
    if (qemu_opt_get(opts, "ip")) {
2761
        const char *ip = qemu_opt_get(opts, "ip");
2762
        int l = strlen(ip) + strlen("/24") + 1;
2763

    
2764
        vnet = qemu_malloc(l);
2765

    
2766
        /* emulate legacy ip= parameter */
2767
        pstrcpy(vnet, l, ip);
2768
        pstrcat(vnet, l, "/24");
2769
    }
2770

    
2771
    if (qemu_opt_get(opts, "net")) {
2772
        if (vnet) {
2773
            qemu_free(vnet);
2774
        }
2775
        vnet = qemu_strdup(qemu_opt_get(opts, "net"));
2776
    }
2777

    
2778
    if (qemu_opt_get(opts, "restrict") &&
2779
        qemu_opt_get(opts, "restrict")[0] == 'y') {
2780
        restricted = 1;
2781
    }
2782

    
2783
    qemu_opt_foreach(opts, net_init_slirp_configs, NULL, 0);
2784

    
2785
    ret = net_slirp_init(vlan, "user", name, restricted, vnet, vhost,
2786
                         vhostname, tftp_export, bootfile, vdhcp_start,
2787
                         vnamesrv, smb_export, vsmbsrv);
2788

    
2789
    while (slirp_configs) {
2790
        config = slirp_configs;
2791
        slirp_configs = config->next;
2792
        qemu_free(config);
2793
    }
2794

    
2795
    if (ret != -1 && vlan) {
2796
        vlan->nb_host_devs++;
2797
    }
2798

    
2799
    qemu_free(vnet);
2800

    
2801
    return ret;
2802
}
2803
#endif /* CONFIG_SLIRP */
2804

    
2805
#if !defined(_WIN32) && !defined(_AIX)
2806
int net_init_tap(QemuOpts *opts, Monitor *mon, const char *name, VLANState *vlan)
2807
{
2808
    TAPState *s;
2809
    int fd, vnet_hdr;
2810

    
2811
    if (qemu_opt_get(opts, "fd")) {
2812
        if (qemu_opt_get(opts, "ifname") ||
2813
            qemu_opt_get(opts, "script") ||
2814
            qemu_opt_get(opts, "downscript") ||
2815
            qemu_opt_get(opts, "vnet_hdr")) {
2816
            qemu_error("ifname=, script=, downscript= and vnet_hdr= is invalid with fd=\n");
2817
            return -1;
2818
        }
2819

    
2820
        fd = net_handle_fd_param(mon, qemu_opt_get(opts, "fd"));
2821
        if (fd == -1) {
2822
            return -1;
2823
        }
2824

    
2825
        fcntl(fd, F_SETFL, O_NONBLOCK);
2826

    
2827
        vnet_hdr = tap_probe_vnet_hdr(fd);
2828
    } else {
2829
        if (!qemu_opt_get(opts, "script")) {
2830
            qemu_opt_set(opts, "script", DEFAULT_NETWORK_SCRIPT);
2831
        }
2832

    
2833
        if (!qemu_opt_get(opts, "downscript")) {
2834
            qemu_opt_set(opts, "downscript", DEFAULT_NETWORK_DOWN_SCRIPT);
2835
        }
2836

    
2837
        fd = net_tap_init(opts, &vnet_hdr);
2838
    }
2839

    
2840
    s = net_tap_fd_init(vlan, "tap", name, fd, vnet_hdr);
2841
    if (!s) {
2842
        close(fd);
2843
        return -1;
2844
    }
2845

    
2846
    if (tap_set_sndbuf(s, opts) < 0) {
2847
        return -1;
2848
    }
2849

    
2850
    if (qemu_opt_get(opts, "fd")) {
2851
        snprintf(s->vc->info_str, sizeof(s->vc->info_str), "fd=%d", fd);
2852
    } else {
2853
        const char *ifname, *script, *downscript;
2854

    
2855
        ifname     = qemu_opt_get(opts, "ifname");
2856
        script     = qemu_opt_get(opts, "script");
2857
        downscript = qemu_opt_get(opts, "downscript");
2858

    
2859
        snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2860
                 "ifname=%s,script=%s,downscript=%s",
2861
                 ifname, script, downscript);
2862

    
2863
        if (strcmp(downscript, "no") != 0) {
2864
            snprintf(s->down_script, sizeof(s->down_script), "%s", downscript);
2865
            snprintf(s->down_script_arg, sizeof(s->down_script_arg), "%s", ifname);
2866
        }
2867
    }
2868

    
2869
    if (vlan) {
2870
        vlan->nb_host_devs++;
2871
    }
2872

    
2873
    return 0;
2874
}
2875
#endif /* !defined(_WIN32) && !defined(_AIX) */
2876

    
2877
static int net_init_socket(QemuOpts *opts,
2878
                           Monitor *mon,
2879
                           const char *name,
2880
                           VLANState *vlan)
2881
{
2882
    if (qemu_opt_get(opts, "fd")) {
2883
        int fd;
2884

    
2885
        if (qemu_opt_get(opts, "listen") ||
2886
            qemu_opt_get(opts, "connect") ||
2887
            qemu_opt_get(opts, "mcast")) {
2888
            qemu_error("listen=, connect= and mcast= is invalid with fd=\n");
2889
            return -1;
2890
        }
2891

    
2892
        fd = net_handle_fd_param(mon, qemu_opt_get(opts, "fd"));
2893
        if (fd == -1) {
2894
            return -1;
2895
        }
2896

    
2897
        if (!net_socket_fd_init(vlan, "socket", name, fd, 1)) {
2898
            close(fd);
2899
            return -1;
2900
        }
2901
    } else if (qemu_opt_get(opts, "listen")) {
2902
        const char *listen;
2903

    
2904
        if (qemu_opt_get(opts, "fd") ||
2905
            qemu_opt_get(opts, "connect") ||
2906
            qemu_opt_get(opts, "mcast")) {
2907
            qemu_error("fd=, connect= and mcast= is invalid with listen=\n");
2908
            return -1;
2909
        }
2910

    
2911
        listen = qemu_opt_get(opts, "listen");
2912

    
2913
        if (net_socket_listen_init(vlan, "socket", name, listen) == -1) {
2914
            return -1;
2915
        }
2916
    } else if (qemu_opt_get(opts, "connect")) {
2917
        const char *connect;
2918

    
2919
        if (qemu_opt_get(opts, "fd") ||
2920
            qemu_opt_get(opts, "listen") ||
2921
            qemu_opt_get(opts, "mcast")) {
2922
            qemu_error("fd=, listen= and mcast= is invalid with connect=\n");
2923
            return -1;
2924
        }
2925

    
2926
        connect = qemu_opt_get(opts, "connect");
2927

    
2928
        if (net_socket_connect_init(vlan, "socket", name, connect) == -1) {
2929
            return -1;
2930
        }
2931
    } else if (qemu_opt_get(opts, "mcast")) {
2932
        const char *mcast;
2933

    
2934
        if (qemu_opt_get(opts, "fd") ||
2935
            qemu_opt_get(opts, "connect") ||
2936
            qemu_opt_get(opts, "listen")) {
2937
            qemu_error("fd=, connect= and listen= is invalid with mcast=\n");
2938
            return -1;
2939
        }
2940

    
2941
        mcast = qemu_opt_get(opts, "mcast");
2942

    
2943
        if (net_socket_mcast_init(vlan, "socket", name, mcast) == -1) {
2944
            return -1;
2945
        }
2946
    } else {
2947
        qemu_error("-socket requires fd=, listen=, connect= or mcast=\n");
2948
        return -1;
2949
    }
2950

    
2951
    if (vlan) {
2952
        vlan->nb_host_devs++;
2953
    }
2954

    
2955
    return 0;
2956
}
2957

    
2958
#ifdef CONFIG_VDE
2959
static int net_init_vde(QemuOpts *opts,
2960
                        Monitor *mon,
2961
                        const char *name,
2962
                        VLANState *vlan)
2963
{
2964
    const char *sock;
2965
    const char *group;
2966
    int port, mode;
2967

    
2968
    sock  = qemu_opt_get(opts, "sock");
2969
    group = qemu_opt_get(opts, "group");
2970

    
2971
    port = qemu_opt_get_number(opts, "port", 0);
2972
    mode = qemu_opt_get_number(opts, "mode", 0700);
2973

    
2974
    if (net_vde_init(vlan, "vde", name, sock, port, group, mode) == -1) {
2975
        return -1;
2976
    }
2977

    
2978
    if (vlan) {
2979
        vlan->nb_host_devs++;
2980
    }
2981

    
2982
    return 0;
2983
}
2984
#endif
2985

    
2986
static int net_init_dump(QemuOpts *opts,
2987
                         Monitor *mon,
2988
                         const char *name,
2989
                         VLANState *vlan)
2990
{
2991
    int len;
2992
    const char *file;
2993
    char def_file[128];
2994

    
2995
    assert(vlan);
2996

    
2997
    file = qemu_opt_get(opts, "file");
2998
    if (!file) {
2999
        snprintf(def_file, sizeof(def_file), "qemu-vlan%d.pcap", vlan->id);
3000
        file = def_file;
3001
    }
3002

    
3003
    len = qemu_opt_get_size(opts, "len", 65536);
3004

    
3005
    return net_dump_init(vlan, "dump", name, file, len);
3006
}
3007

    
3008
#define NET_COMMON_PARAMS_DESC                     \
3009
    {                                              \
3010
        .name = "type",                            \
3011
        .type = QEMU_OPT_STRING,                   \
3012
        .help = "net client type (nic, tap etc.)", \
3013
     }, {                                          \
3014
        .name = "vlan",                            \
3015
        .type = QEMU_OPT_NUMBER,                   \
3016
        .help = "vlan number",                     \
3017
     }, {                                          \
3018
        .name = "name",                            \
3019
        .type = QEMU_OPT_STRING,                   \
3020
        .help = "identifier for monitor commands", \
3021
     }
3022

    
3023
typedef int (*net_client_init_func)(QemuOpts *opts,
3024
                                    Monitor *mon,
3025
                                    const char *name,
3026
                                    VLANState *vlan);
3027

    
3028
/* magic number, but compiler will warn if too small */
3029
#define NET_MAX_DESC 20
3030

    
3031
static struct {
3032
    const char *type;
3033
    net_client_init_func init;
3034
    QemuOptDesc desc[NET_MAX_DESC];
3035
} net_client_types[] = {
3036
    {
3037
        .type = "none",
3038
        .desc = {
3039
            NET_COMMON_PARAMS_DESC,
3040
            { /* end of list */ }
3041
        },
3042
    }, {
3043
        .type = "nic",
3044
        .init = net_init_nic,
3045
        .desc = {
3046
            NET_COMMON_PARAMS_DESC,
3047
            {
3048
                .name = "netdev",
3049
                .type = QEMU_OPT_STRING,
3050
                .help = "id of -netdev to connect to",
3051
            },
3052
            {
3053
                .name = "macaddr",
3054
                .type = QEMU_OPT_STRING,
3055
                .help = "MAC address",
3056
            }, {
3057
                .name = "model",
3058
                .type = QEMU_OPT_STRING,
3059
                .help = "device model (e1000, rtl8139, virtio etc.)",
3060
            }, {
3061
                .name = "addr",
3062
                .type = QEMU_OPT_STRING,
3063
                .help = "PCI device address",
3064
            }, {
3065
                .name = "vectors",
3066
                .type = QEMU_OPT_NUMBER,
3067
                .help = "number of MSI-x vectors, 0 to disable MSI-X",
3068
            },
3069
            { /* end of list */ }
3070
        },
3071
#ifdef CONFIG_SLIRP
3072
    }, {
3073
        .type = "user",
3074
        .init = net_init_slirp,
3075
        .desc = {
3076
            NET_COMMON_PARAMS_DESC,
3077
            {
3078
                .name = "hostname",
3079
                .type = QEMU_OPT_STRING,
3080
                .help = "client hostname reported by the builtin DHCP server",
3081
            }, {
3082
                .name = "restrict",
3083
                .type = QEMU_OPT_STRING,
3084
                .help = "isolate the guest from the host (y|yes|n|no)",
3085
            }, {
3086
                .name = "ip",
3087
                .type = QEMU_OPT_STRING,
3088
                .help = "legacy parameter, use net= instead",
3089
            }, {
3090
                .name = "net",
3091
                .type = QEMU_OPT_STRING,
3092
                .help = "IP address and optional netmask",
3093
            }, {
3094
                .name = "host",
3095
                .type = QEMU_OPT_STRING,
3096
                .help = "guest-visible address of the host",
3097
            }, {
3098
                .name = "tftp",
3099
                .type = QEMU_OPT_STRING,
3100
                .help = "root directory of the built-in TFTP server",
3101
            }, {
3102
                .name = "bootfile",
3103
                .type = QEMU_OPT_STRING,
3104
                .help = "BOOTP filename, for use with tftp=",
3105
            }, {
3106
                .name = "dhcpstart",
3107
                .type = QEMU_OPT_STRING,
3108
                .help = "the first of the 16 IPs the built-in DHCP server can assign",
3109
            }, {
3110
                .name = "dns",
3111
                .type = QEMU_OPT_STRING,
3112
                .help = "guest-visible address of the virtual nameserver",
3113
            }, {
3114
                .name = "smb",
3115
                .type = QEMU_OPT_STRING,
3116
                .help = "root directory of the built-in SMB server",
3117
            }, {
3118
                .name = "smbserver",
3119
                .type = QEMU_OPT_STRING,
3120
                .help = "IP address of the built-in SMB server",
3121
            }, {
3122
                .name = "hostfwd",
3123
                .type = QEMU_OPT_STRING,
3124
                .help = "guest port number to forward incoming TCP or UDP connections",
3125
            }, {
3126
                .name = "guestfwd",
3127
                .type = QEMU_OPT_STRING,
3128
                .help = "IP address and port to forward guest TCP connections",
3129
            },
3130
            { /* end of list */ }
3131
        },
3132
#endif
3133
#ifndef _AIX
3134
    }, {
3135
        .type = "tap",
3136
        .init = net_init_tap,
3137
        .desc = {
3138
            NET_COMMON_PARAMS_DESC,
3139
            {
3140
                .name = "ifname",
3141
                .type = QEMU_OPT_STRING,
3142
                .help = "interface name",
3143
            },
3144
#ifndef _WIN32
3145
            {
3146
                .name = "fd",
3147
                .type = QEMU_OPT_STRING,
3148
                .help = "file descriptor of an already opened tap",
3149
            }, {
3150
                .name = "script",
3151
                .type = QEMU_OPT_STRING,
3152
                .help = "script to initialize the interface",
3153
            }, {
3154
                .name = "downscript",
3155
                .type = QEMU_OPT_STRING,
3156
                .help = "script to shut down the interface",
3157
            }, {
3158
                .name = "sndbuf",
3159
                .type = QEMU_OPT_SIZE,
3160
                .help = "send buffer limit"
3161
            }, {
3162
                .name = "vnet_hdr",
3163
                .type = QEMU_OPT_BOOL,
3164
                .help = "enable the IFF_VNET_HDR flag on the tap interface"
3165
            },
3166
#endif /* _WIN32 */
3167
            { /* end of list */ }
3168
        },
3169
#endif /* _AIX */
3170
    }, {
3171
        .type = "socket",
3172
        .init = net_init_socket,
3173
        .desc = {
3174
            NET_COMMON_PARAMS_DESC,
3175
            {
3176
                .name = "fd",
3177
                .type = QEMU_OPT_STRING,
3178
                .help = "file descriptor of an already opened socket",
3179
            }, {
3180
                .name = "listen",
3181
                .type = QEMU_OPT_STRING,
3182
                .help = "port number, and optional hostname, to listen on",
3183
            }, {
3184
                .name = "connect",
3185
                .type = QEMU_OPT_STRING,
3186
                .help = "port number, and optional hostname, to connect to",
3187
            }, {
3188
                .name = "mcast",
3189
                .type = QEMU_OPT_STRING,
3190
                .help = "UDP multicast address and port number",
3191
            },
3192
            { /* end of list */ }
3193
        },
3194
#ifdef CONFIG_VDE
3195
    }, {
3196
        .type = "vde",
3197
        .init = net_init_vde,
3198
        .desc = {
3199
            NET_COMMON_PARAMS_DESC,
3200
            {
3201
                .name = "sock",
3202
                .type = QEMU_OPT_STRING,
3203
                .help = "socket path",
3204
            }, {
3205
                .name = "port",
3206
                .type = QEMU_OPT_NUMBER,
3207
                .help = "port number",
3208
            }, {
3209
                .name = "group",
3210
                .type = QEMU_OPT_STRING,
3211
                .help = "group owner of socket",
3212
            }, {
3213
                .name = "mode",
3214
                .type = QEMU_OPT_NUMBER,
3215
                .help = "permissions for socket",
3216
            },
3217
            { /* end of list */ }
3218
        },
3219
#endif
3220
    }, {
3221
        .type = "dump",
3222
        .init = net_init_dump,
3223
        .desc = {
3224
            NET_COMMON_PARAMS_DESC,
3225
            {
3226
                .name = "len",
3227
                .type = QEMU_OPT_SIZE,
3228
                .help = "per-packet size limit (64k default)",
3229
            }, {
3230
                .name = "file",
3231
                .type = QEMU_OPT_STRING,
3232
                .help = "dump file path (default is qemu-vlan0.pcap)",
3233
            },
3234
            { /* end of list */ }
3235
        },
3236
    },
3237
    { /* end of list */ }
3238
};
3239

    
3240
int net_client_init(Monitor *mon, QemuOpts *opts, int is_netdev)
3241
{
3242
    const char *name;
3243
    const char *type;
3244
    int i;
3245

    
3246
    type = qemu_opt_get(opts, "type");
3247
    if (!type) {
3248
        qemu_error("No type specified for -net\n");
3249
        return -1;
3250
    }
3251

    
3252
    if (is_netdev) {
3253
        if (strcmp(type, "tap") != 0 &&
3254
#ifdef CONFIG_SLIRP
3255
            strcmp(type, "user") != 0 &&
3256
#endif
3257
#ifdef CONFIG_VDE
3258
            strcmp(type, "vde") != 0 &&
3259
#endif
3260
            strcmp(type, "socket") != 0) {
3261
            qemu_error("The '%s' network backend type is not valid with -netdev\n",
3262
                       type);
3263
            return -1;
3264
        }
3265

    
3266
        if (qemu_opt_get(opts, "vlan")) {
3267
            qemu_error("The 'vlan' parameter is not valid with -netdev\n");
3268
            return -1;
3269
        }
3270
        if (qemu_opt_get(opts, "name")) {
3271
            qemu_error("The 'name' parameter is not valid with -netdev\n");
3272
            return -1;
3273
        }
3274
        if (!qemu_opts_id(opts)) {
3275
            qemu_error("The id= parameter is required with -netdev\n");
3276
            return -1;
3277
        }
3278
    }
3279

    
3280
    name = qemu_opts_id(opts);
3281
    if (!name) {
3282
        name = qemu_opt_get(opts, "name");
3283
    }
3284

    
3285
    for (i = 0; net_client_types[i].type != NULL; i++) {
3286
        if (!strcmp(net_client_types[i].type, type)) {
3287
            VLANState *vlan = NULL;
3288

    
3289
            if (qemu_opts_validate(opts, &net_client_types[i].desc[0]) == -1) {
3290
                return -1;
3291
            }
3292

    
3293
            /* Do not add to a vlan if it's a -netdev or a nic with a
3294
             * netdev= parameter. */
3295
            if (!(is_netdev ||
3296
                  (strcmp(type, "nic") == 0 && qemu_opt_get(opts, "netdev")))) {
3297
                vlan = qemu_find_vlan(qemu_opt_get_number(opts, "vlan", 0), 1);
3298
            }
3299

    
3300
            if (net_client_types[i].init) {
3301
                return net_client_types[i].init(opts, mon, name, vlan);
3302
            } else {
3303
                return 0;
3304
            }
3305
        }
3306
    }
3307

    
3308
    qemu_error("Invalid -net type '%s'\n", type);
3309
    return -1;
3310
}
3311

    
3312
void net_client_uninit(NICInfo *nd)
3313
{
3314
    if (nd->vlan) {
3315
        nd->vlan->nb_guest_devs--;
3316
    }
3317
    nb_nics--;
3318

    
3319
    qemu_free(nd->model);
3320
    qemu_free(nd->name);
3321
    qemu_free(nd->devaddr);
3322

    
3323
    nd->used = 0;
3324
}
3325

    
3326
static int net_host_check_device(const char *device)
3327
{
3328
    int i;
3329
    const char *valid_param_list[] = { "tap", "socket", "dump"
3330
#ifdef CONFIG_SLIRP
3331
                                       ,"user"
3332
#endif
3333
#ifdef CONFIG_VDE
3334
                                       ,"vde"
3335
#endif
3336
    };
3337
    for (i = 0; i < sizeof(valid_param_list) / sizeof(char *); i++) {
3338
        if (!strncmp(valid_param_list[i], device,
3339
                     strlen(valid_param_list[i])))
3340
            return 1;
3341
    }
3342

    
3343
    return 0;
3344
}
3345

    
3346
void net_host_device_add(Monitor *mon, const QDict *qdict)
3347
{
3348
    const char *device = qdict_get_str(qdict, "device");
3349
    const char *opts_str = qdict_get_try_str(qdict, "opts");
3350
    QemuOpts *opts;
3351

    
3352
    if (!net_host_check_device(device)) {
3353
        monitor_printf(mon, "invalid host network device %s\n", device);
3354
        return;
3355
    }
3356

    
3357
    opts = qemu_opts_parse(&qemu_net_opts, opts_str ? opts_str : "", NULL);
3358
    if (!opts) {
3359
        monitor_printf(mon, "parsing network options '%s' failed\n",
3360
                       opts_str ? opts_str : "");
3361
        return;
3362
    }
3363

    
3364
    qemu_opt_set(opts, "type", device);
3365

    
3366
    if (net_client_init(mon, opts, 0) < 0) {
3367
        monitor_printf(mon, "adding host network device %s failed\n", device);
3368
    }
3369
}
3370

    
3371
void net_host_device_remove(Monitor *mon, const QDict *qdict)
3372
{
3373
    VLANClientState *vc;
3374
    int vlan_id = qdict_get_int(qdict, "vlan_id");
3375
    const char *device = qdict_get_str(qdict, "device");
3376

    
3377
    vc = qemu_find_vlan_client_by_name(mon, vlan_id, device);
3378
    if (!vc) {
3379
        return;
3380
    }
3381
    if (!net_host_check_device(vc->model)) {
3382
        monitor_printf(mon, "invalid host network device %s\n", device);
3383
        return;
3384
    }
3385
    qemu_del_vlan_client(vc);
3386
}
3387

    
3388
void net_set_boot_mask(int net_boot_mask)
3389
{
3390
    int i;
3391

    
3392
    /* Only the first four NICs may be bootable */
3393
    net_boot_mask = net_boot_mask & 0xF;
3394

    
3395
    for (i = 0; i < nb_nics; i++) {
3396
        if (net_boot_mask & (1 << i)) {
3397
            nd_table[i].bootable = 1;
3398
            net_boot_mask &= ~(1 << i);
3399
        }
3400
    }
3401

    
3402
    if (net_boot_mask) {
3403
        fprintf(stderr, "Cannot boot from non-existent NIC\n");
3404
        exit(1);
3405
    }
3406
}
3407

    
3408
void do_info_network(Monitor *mon)
3409
{
3410
    VLANState *vlan;
3411

    
3412
    QTAILQ_FOREACH(vlan, &vlans, next) {
3413
        VLANClientState *vc;
3414

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

    
3417
        QTAILQ_FOREACH(vc, &vlan->clients, next) {
3418
            monitor_printf(mon, "  %s: %s\n", vc->name, vc->info_str);
3419
        }
3420
    }
3421
}
3422

    
3423
void do_set_link(Monitor *mon, const QDict *qdict)
3424
{
3425
    VLANState *vlan;
3426
    VLANClientState *vc = NULL;
3427
    const char *name = qdict_get_str(qdict, "name");
3428
    const char *up_or_down = qdict_get_str(qdict, "up_or_down");
3429

    
3430
    QTAILQ_FOREACH(vlan, &vlans, next) {
3431
        QTAILQ_FOREACH(vc, &vlan->clients, next) {
3432
            if (strcmp(vc->name, name) == 0) {
3433
                goto done;
3434
            }
3435
        }
3436
    }
3437
done:
3438

    
3439
    if (!vc) {
3440
        monitor_printf(mon, "could not find network device '%s'\n", name);
3441
        return;
3442
    }
3443

    
3444
    if (strcmp(up_or_down, "up") == 0)
3445
        vc->link_down = 0;
3446
    else if (strcmp(up_or_down, "down") == 0)
3447
        vc->link_down = 1;
3448
    else
3449
        monitor_printf(mon, "invalid link status '%s'; only 'up' or 'down' "
3450
                       "valid\n", up_or_down);
3451

    
3452
    if (vc->link_status_changed)
3453
        vc->link_status_changed(vc);
3454
}
3455

    
3456
void net_cleanup(void)
3457
{
3458
    VLANState *vlan;
3459
    VLANClientState *vc, *next_vc;
3460

    
3461
    QTAILQ_FOREACH(vlan, &vlans, next) {
3462
        QTAILQ_FOREACH_SAFE(vc, &vlan->clients, next, next_vc) {
3463
            qemu_del_vlan_client(vc);
3464
        }
3465
    }
3466

    
3467
    QTAILQ_FOREACH_SAFE(vc, &non_vlan_clients, next, next_vc) {
3468
        qemu_del_vlan_client(vc);
3469
    }
3470
}
3471

    
3472
static void net_check_clients(void)
3473
{
3474
    VLANState *vlan;
3475

    
3476
    QTAILQ_FOREACH(vlan, &vlans, next) {
3477
        if (vlan->nb_guest_devs == 0 && vlan->nb_host_devs == 0)
3478
            continue;
3479
        if (vlan->nb_guest_devs == 0)
3480
            fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id);
3481
        if (vlan->nb_host_devs == 0)
3482
            fprintf(stderr,
3483
                    "Warning: vlan %d is not connected to host network\n",
3484
                    vlan->id);
3485
    }
3486
}
3487

    
3488
static int net_init_client(QemuOpts *opts, void *dummy)
3489
{
3490
    if (net_client_init(NULL, opts, 0) < 0)
3491
        return -1;
3492
    return 0;
3493
}
3494

    
3495
static int net_init_netdev(QemuOpts *opts, void *dummy)
3496
{
3497
    return net_client_init(NULL, opts, 1);
3498
}
3499

    
3500
int net_init_clients(void)
3501
{
3502
    if (QTAILQ_EMPTY(&qemu_net_opts.head)) {
3503
        /* if no clients, we use a default config */
3504
        qemu_opts_set(&qemu_net_opts, NULL, "type", "nic");
3505
#ifdef CONFIG_SLIRP
3506
        qemu_opts_set(&qemu_net_opts, NULL, "type", "user");
3507
#endif
3508
    }
3509

    
3510
    QTAILQ_INIT(&vlans);
3511
    QTAILQ_INIT(&non_vlan_clients);
3512

    
3513
    if (qemu_opts_foreach(&qemu_netdev_opts, net_init_netdev, NULL, 1) == -1)
3514
        return -1;
3515

    
3516
    if (qemu_opts_foreach(&qemu_net_opts, net_init_client, NULL, 1) == -1) {
3517
        return -1;
3518
    }
3519

    
3520
    net_check_clients();
3521

    
3522
    return 0;
3523
}
3524

    
3525
int net_client_parse(QemuOptsList *opts_list, const char *optarg)
3526
{
3527
#if defined(CONFIG_SLIRP)
3528
    /* handle legacy -net channel,port:chr */
3529
    if (!strcmp(opts_list->name, "net") &&
3530
        !strncmp(optarg, "channel,", strlen("channel,"))) {
3531
        int ret;
3532

    
3533
        optarg += strlen("channel,");
3534

    
3535
        if (QTAILQ_EMPTY(&slirp_stacks)) {
3536
            struct slirp_config_str *config;
3537

    
3538
            config = qemu_malloc(sizeof(*config));
3539
            pstrcpy(config->str, sizeof(config->str), optarg);
3540
            config->flags = SLIRP_CFG_LEGACY;
3541
            config->next = slirp_configs;
3542
            slirp_configs = config;
3543
            ret = 0;
3544
        } else {
3545
            ret = slirp_guestfwd(QTAILQ_FIRST(&slirp_stacks), optarg, 1);
3546
        }
3547

    
3548
        return ret;
3549
    }
3550
#endif
3551
    if (!qemu_opts_parse(opts_list, optarg, "type")) {
3552
        return -1;
3553
    }
3554

    
3555
    return 0;
3556
}