Statistics
| Branch: | Revision:

root / net.c @ 6c9f58ba

History | View | Annotate | Download (94.4 kB)

1
/*
2
 * QEMU System Emulator
3
 *
4
 * Copyright (c) 2003-2008 Fabrice Bellard
5
 *
6
 * Permission is hereby granted, free of charge, to any person obtaining a copy
7
 * of this software and associated documentation files (the "Software"), to deal
8
 * in the Software without restriction, including without limitation the rights
9
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
 * copies of the Software, and to permit persons to whom the Software is
11
 * furnished to do so, subject to the following conditions:
12
 *
13
 * The above copyright notice and this permission notice shall be included in
14
 * all copies or substantial portions of the Software.
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22
 * THE SOFTWARE.
23
 */
24
#include <unistd.h>
25
#include <fcntl.h>
26
#include <signal.h>
27
#include <time.h>
28
#include <errno.h>
29
#include <sys/time.h>
30
#include <zlib.h>
31

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

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

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

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

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

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

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

    
115
#include "slirp/libslirp.h"
116

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

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

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

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

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

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

    
180
    return -1;
181
}
182

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
316
    return qemu_strdup(buf);
317
}
318

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

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

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

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

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

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

    
375
    return vc;
376
}
377

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

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

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

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

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

    
411
    return NULL;
412
}
413

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

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

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

    
437
    return vc;
438
}
439

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
519
    return ret;
520
}
521

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

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

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

    
536
    qemu_net_queue_purge(queue, vc);
537
}
538

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

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

    
549
    qemu_net_queue_flush(queue);
550
}
551

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
676
    return ret;
677
}
678

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

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

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

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

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

    
706
#if defined(CONFIG_SLIRP)
707

    
708
/* slirp network adapter */
709

    
710
#define SLIRP_CFG_HOSTFWD 1
711
#define SLIRP_CFG_LEGACY  2
712

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
996
    host_port = atoi(p);
997

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1093
}
1094

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

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

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

    
1111
#ifndef _WIN32
1112

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
1295
#endif /* CONFIG_SLIRP */
1296

    
1297
#if defined(_WIN32)
1298
int tap_has_ufo(VLANClientState *vc)
1299
{
1300
    return 0;
1301
}
1302
int tap_has_vnet_hdr(VLANClientState *vc)
1303
{
1304
    return 0;
1305
}
1306
void tap_using_vnet_hdr(VLANClientState *vc, int using_vnet_hdr)
1307
{
1308
}
1309
void tap_set_offload(VLANClientState *vc, int csum, int tso4,
1310
                     int tso6, int ecn, int ufo)
1311
{
1312
}
1313
#else /* !defined(_WIN32) */
1314

    
1315
/* Maximum GSO packet size (64k) plus plenty of room for
1316
 * the ethernet and virtio_net headers
1317
 */
1318
#define TAP_BUFSIZE (4096 + 65536)
1319

    
1320
typedef struct TAPState {
1321
    VLANClientState *vc;
1322
    int fd;
1323
    char down_script[1024];
1324
    char down_script_arg[128];
1325
    uint8_t buf[TAP_BUFSIZE];
1326
    unsigned int read_poll : 1;
1327
    unsigned int write_poll : 1;
1328
    unsigned int has_vnet_hdr : 1;
1329
    unsigned int using_vnet_hdr : 1;
1330
    unsigned int has_ufo: 1;
1331
} TAPState;
1332

    
1333
static int launch_script(const char *setup_script, const char *ifname, int fd);
1334

    
1335
static int tap_can_send(void *opaque);
1336
static void tap_send(void *opaque);
1337
static void tap_writable(void *opaque);
1338

    
1339
static void tap_update_fd_handler(TAPState *s)
1340
{
1341
    qemu_set_fd_handler2(s->fd,
1342
                         s->read_poll  ? tap_can_send : NULL,
1343
                         s->read_poll  ? tap_send     : NULL,
1344
                         s->write_poll ? tap_writable : NULL,
1345
                         s);
1346
}
1347

    
1348
static void tap_read_poll(TAPState *s, int enable)
1349
{
1350
    s->read_poll = !!enable;
1351
    tap_update_fd_handler(s);
1352
}
1353

    
1354
static void tap_write_poll(TAPState *s, int enable)
1355
{
1356
    s->write_poll = !!enable;
1357
    tap_update_fd_handler(s);
1358
}
1359

    
1360
static void tap_writable(void *opaque)
1361
{
1362
    TAPState *s = opaque;
1363

    
1364
    tap_write_poll(s, 0);
1365

    
1366
    qemu_flush_queued_packets(s->vc);
1367
}
1368

    
1369
static ssize_t tap_write_packet(TAPState *s, const struct iovec *iov, int iovcnt)
1370
{
1371
    ssize_t len;
1372

    
1373
    do {
1374
        len = writev(s->fd, iov, iovcnt);
1375
    } while (len == -1 && errno == EINTR);
1376

    
1377
    if (len == -1 && errno == EAGAIN) {
1378
        tap_write_poll(s, 1);
1379
        return 0;
1380
    }
1381

    
1382
    return len;
1383
}
1384

    
1385
static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov,
1386
                               int iovcnt)
1387
{
1388
    TAPState *s = vc->opaque;
1389
    const struct iovec *iovp = iov;
1390
    struct iovec iov_copy[iovcnt + 1];
1391
    struct virtio_net_hdr hdr = { 0, };
1392

    
1393
    if (s->has_vnet_hdr && !s->using_vnet_hdr) {
1394
        iov_copy[0].iov_base = &hdr;
1395
        iov_copy[0].iov_len =  sizeof(hdr);
1396
        memcpy(&iov_copy[1], iov, iovcnt * sizeof(*iov));
1397
        iovp = iov_copy;
1398
        iovcnt++;
1399
    }
1400

    
1401
    return tap_write_packet(s, iovp, iovcnt);
1402
}
1403

    
1404
static ssize_t tap_receive_raw(VLANClientState *vc, const uint8_t *buf, size_t size)
1405
{
1406
    TAPState *s = vc->opaque;
1407
    struct iovec iov[2];
1408
    int iovcnt = 0;
1409
    struct virtio_net_hdr hdr = { 0, };
1410

    
1411
    if (s->has_vnet_hdr) {
1412
        iov[iovcnt].iov_base = &hdr;
1413
        iov[iovcnt].iov_len  = sizeof(hdr);
1414
        iovcnt++;
1415
    }
1416

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

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

    
1424
static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1425
{
1426
    TAPState *s = vc->opaque;
1427
    struct iovec iov[1];
1428

    
1429
    if (s->has_vnet_hdr && !s->using_vnet_hdr) {
1430
        return tap_receive_raw(vc, buf, size);
1431
    }
1432

    
1433
    iov[0].iov_base = (char *)buf;
1434
    iov[0].iov_len  = size;
1435

    
1436
    return tap_write_packet(s, iov, 1);
1437
}
1438

    
1439
static int tap_can_send(void *opaque)
1440
{
1441
    TAPState *s = opaque;
1442

    
1443
    return qemu_can_send_packet(s->vc);
1444
}
1445

    
1446
#ifdef __sun__
1447
static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1448
{
1449
    struct strbuf sbuf;
1450
    int f = 0;
1451

    
1452
    sbuf.maxlen = maxlen;
1453
    sbuf.buf = (char *)buf;
1454

    
1455
    return getmsg(tapfd, NULL, &sbuf, &f) >= 0 ? sbuf.len : -1;
1456
}
1457
#else
1458
static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1459
{
1460
    return read(tapfd, buf, maxlen);
1461
}
1462
#endif
1463

    
1464
static void tap_send_completed(VLANClientState *vc, ssize_t len)
1465
{
1466
    TAPState *s = vc->opaque;
1467
    tap_read_poll(s, 1);
1468
}
1469

    
1470
static void tap_send(void *opaque)
1471
{
1472
    TAPState *s = opaque;
1473
    int size;
1474

    
1475
    do {
1476
        uint8_t *buf = s->buf;
1477

    
1478
        size = tap_read_packet(s->fd, s->buf, sizeof(s->buf));
1479
        if (size <= 0) {
1480
            break;
1481
        }
1482

    
1483
        if (s->has_vnet_hdr && !s->using_vnet_hdr) {
1484
            buf  += sizeof(struct virtio_net_hdr);
1485
            size -= sizeof(struct virtio_net_hdr);
1486
        }
1487

    
1488
        size = qemu_send_packet_async(s->vc, buf, size, tap_send_completed);
1489
        if (size == 0) {
1490
            tap_read_poll(s, 0);
1491
        }
1492
    } while (size > 0);
1493
}
1494

    
1495
/* sndbuf should be set to a value lower than the tx queue
1496
 * capacity of any destination network interface.
1497
 * Ethernet NICs generally have txqueuelen=1000, so 1Mb is
1498
 * a good default, given a 1500 byte MTU.
1499
 */
1500
#define TAP_DEFAULT_SNDBUF 1024*1024
1501

    
1502
static int tap_set_sndbuf(TAPState *s, QemuOpts *opts)
1503
{
1504
    int sndbuf;
1505

    
1506
    sndbuf = qemu_opt_get_size(opts, "sndbuf", TAP_DEFAULT_SNDBUF);
1507
    if (!sndbuf) {
1508
        sndbuf = INT_MAX;
1509
    }
1510

    
1511
    if (ioctl(s->fd, TUNSETSNDBUF, &sndbuf) == -1 && qemu_opt_get(opts, "sndbuf")) {
1512
        qemu_error("TUNSETSNDBUF ioctl failed: %s\n", strerror(errno));
1513
        return -1;
1514
    }
1515
    return 0;
1516
}
1517

    
1518
int tap_has_ufo(VLANClientState *vc)
1519
{
1520
    TAPState *s = vc->opaque;
1521

    
1522
    assert(vc->type == NET_CLIENT_TYPE_TAP);
1523

    
1524
    return s->has_ufo;
1525
}
1526

    
1527
int tap_has_vnet_hdr(VLANClientState *vc)
1528
{
1529
    TAPState *s = vc->opaque;
1530

    
1531
    assert(vc->type == NET_CLIENT_TYPE_TAP);
1532

    
1533
    return s->has_vnet_hdr;
1534
}
1535

    
1536
void tap_using_vnet_hdr(VLANClientState *vc, int using_vnet_hdr)
1537
{
1538
    TAPState *s = vc->opaque;
1539

    
1540
    using_vnet_hdr = using_vnet_hdr != 0;
1541

    
1542
    assert(vc->type == NET_CLIENT_TYPE_TAP);
1543
    assert(s->has_vnet_hdr == using_vnet_hdr);
1544

    
1545
    s->using_vnet_hdr = using_vnet_hdr;
1546
}
1547

    
1548
static int tap_probe_vnet_hdr(int fd)
1549
{
1550
    struct ifreq ifr;
1551

    
1552
    if (ioctl(fd, TUNGETIFF, &ifr) != 0) {
1553
        qemu_error("TUNGETIFF ioctl() failed: %s\n", strerror(errno));
1554
        return 0;
1555
    }
1556

    
1557
    return ifr.ifr_flags & IFF_VNET_HDR;
1558
}
1559

    
1560
void tap_set_offload(VLANClientState *vc, int csum, int tso4,
1561
                     int tso6, int ecn, int ufo)
1562
{
1563
    TAPState *s = vc->opaque;
1564
    unsigned int offload = 0;
1565

    
1566
    if (csum) {
1567
        offload |= TUN_F_CSUM;
1568
        if (tso4)
1569
            offload |= TUN_F_TSO4;
1570
        if (tso6)
1571
            offload |= TUN_F_TSO6;
1572
        if ((tso4 || tso6) && ecn)
1573
            offload |= TUN_F_TSO_ECN;
1574
        if (ufo)
1575
            offload |= TUN_F_UFO;
1576
    }
1577

    
1578
    if (ioctl(s->fd, TUNSETOFFLOAD, offload) != 0) {
1579
        offload &= ~TUN_F_UFO;
1580
        if (ioctl(s->fd, TUNSETOFFLOAD, offload) != 0) {
1581
            fprintf(stderr, "TUNSETOFFLOAD ioctl() failed: %s\n",
1582
                    strerror(errno));
1583
        }
1584
    }
1585
}
1586

    
1587
static void tap_cleanup(VLANClientState *vc)
1588
{
1589
    TAPState *s = vc->opaque;
1590

    
1591
    qemu_purge_queued_packets(vc);
1592

    
1593
    if (s->down_script[0])
1594
        launch_script(s->down_script, s->down_script_arg, s->fd);
1595

    
1596
    tap_read_poll(s, 0);
1597
    tap_write_poll(s, 0);
1598
    close(s->fd);
1599
    qemu_free(s);
1600
}
1601

    
1602
/* fd support */
1603

    
1604
static TAPState *net_tap_fd_init(VLANState *vlan,
1605
                                 const char *model,
1606
                                 const char *name,
1607
                                 int fd,
1608
                                 int vnet_hdr)
1609
{
1610
    TAPState *s;
1611
    unsigned int offload;
1612

    
1613
    s = qemu_mallocz(sizeof(TAPState));
1614
    s->fd = fd;
1615
    s->has_vnet_hdr = vnet_hdr != 0;
1616
    s->using_vnet_hdr = 0;
1617
    s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_TAP,
1618
                                 vlan, NULL, model, name, NULL,
1619
                                 tap_receive, tap_receive_raw,
1620
                                 tap_receive_iov, tap_cleanup, s);
1621
    s->has_ufo = 0;
1622
    /* Check if tap supports UFO */
1623
    offload = TUN_F_CSUM | TUN_F_UFO;
1624
    if (ioctl(s->fd, TUNSETOFFLOAD, offload) == 0)
1625
       s->has_ufo = 1;
1626
    tap_set_offload(s->vc, 0, 0, 0, 0, 0);
1627
    tap_read_poll(s, 1);
1628
    return s;
1629
}
1630

    
1631
#if defined (CONFIG_BSD) || defined (__FreeBSD_kernel__)
1632
static int tap_open(char *ifname, int ifname_size,
1633
                    int *vnet_hdr, int vnet_hdr_required)
1634
{
1635
    int fd;
1636
    char *dev;
1637
    struct stat s;
1638

    
1639
    TFR(fd = open("/dev/tap", O_RDWR));
1640
    if (fd < 0) {
1641
        fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
1642
        return -1;
1643
    }
1644

    
1645
    fstat(fd, &s);
1646
    dev = devname(s.st_rdev, S_IFCHR);
1647
    pstrcpy(ifname, ifname_size, dev);
1648

    
1649
    fcntl(fd, F_SETFL, O_NONBLOCK);
1650
    return fd;
1651
}
1652
#elif defined(__sun__)
1653
#define TUNNEWPPA       (('T'<<16) | 0x0001)
1654
/*
1655
 * Allocate TAP device, returns opened fd.
1656
 * Stores dev name in the first arg(must be large enough).
1657
 */
1658
static int tap_alloc(char *dev, size_t dev_size)
1659
{
1660
    int tap_fd, if_fd, ppa = -1;
1661
    static int ip_fd = 0;
1662
    char *ptr;
1663

    
1664
    static int arp_fd = 0;
1665
    int ip_muxid, arp_muxid;
1666
    struct strioctl  strioc_if, strioc_ppa;
1667
    int link_type = I_PLINK;;
1668
    struct lifreq ifr;
1669
    char actual_name[32] = "";
1670

    
1671
    memset(&ifr, 0x0, sizeof(ifr));
1672

    
1673
    if( *dev ){
1674
       ptr = dev;
1675
       while( *ptr && !qemu_isdigit((int)*ptr) ) ptr++;
1676
       ppa = atoi(ptr);
1677
    }
1678

    
1679
    /* Check if IP device was opened */
1680
    if( ip_fd )
1681
       close(ip_fd);
1682

    
1683
    TFR(ip_fd = open("/dev/udp", O_RDWR, 0));
1684
    if (ip_fd < 0) {
1685
       syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)");
1686
       return -1;
1687
    }
1688

    
1689
    TFR(tap_fd = open("/dev/tap", O_RDWR, 0));
1690
    if (tap_fd < 0) {
1691
       syslog(LOG_ERR, "Can't open /dev/tap");
1692
       return -1;
1693
    }
1694

    
1695
    /* Assign a new PPA and get its unit number. */
1696
    strioc_ppa.ic_cmd = TUNNEWPPA;
1697
    strioc_ppa.ic_timout = 0;
1698
    strioc_ppa.ic_len = sizeof(ppa);
1699
    strioc_ppa.ic_dp = (char *)&ppa;
1700
    if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0)
1701
       syslog (LOG_ERR, "Can't assign new interface");
1702

    
1703
    TFR(if_fd = open("/dev/tap", O_RDWR, 0));
1704
    if (if_fd < 0) {
1705
       syslog(LOG_ERR, "Can't open /dev/tap (2)");
1706
       return -1;
1707
    }
1708
    if(ioctl(if_fd, I_PUSH, "ip") < 0){
1709
       syslog(LOG_ERR, "Can't push IP module");
1710
       return -1;
1711
    }
1712

    
1713
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) < 0)
1714
        syslog(LOG_ERR, "Can't get flags\n");
1715

    
1716
    snprintf (actual_name, 32, "tap%d", ppa);
1717
    pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
1718

    
1719
    ifr.lifr_ppa = ppa;
1720
    /* Assign ppa according to the unit number returned by tun device */
1721

    
1722
    if (ioctl (if_fd, SIOCSLIFNAME, &ifr) < 0)
1723
        syslog (LOG_ERR, "Can't set PPA %d", ppa);
1724
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) <0)
1725
        syslog (LOG_ERR, "Can't get flags\n");
1726
    /* Push arp module to if_fd */
1727
    if (ioctl (if_fd, I_PUSH, "arp") < 0)
1728
        syslog (LOG_ERR, "Can't push ARP module (2)");
1729

    
1730
    /* Push arp module to ip_fd */
1731
    if (ioctl (ip_fd, I_POP, NULL) < 0)
1732
        syslog (LOG_ERR, "I_POP failed\n");
1733
    if (ioctl (ip_fd, I_PUSH, "arp") < 0)
1734
        syslog (LOG_ERR, "Can't push ARP module (3)\n");
1735
    /* Open arp_fd */
1736
    TFR(arp_fd = open ("/dev/tap", O_RDWR, 0));
1737
    if (arp_fd < 0)
1738
       syslog (LOG_ERR, "Can't open %s\n", "/dev/tap");
1739

    
1740
    /* Set ifname to arp */
1741
    strioc_if.ic_cmd = SIOCSLIFNAME;
1742
    strioc_if.ic_timout = 0;
1743
    strioc_if.ic_len = sizeof(ifr);
1744
    strioc_if.ic_dp = (char *)&ifr;
1745
    if (ioctl(arp_fd, I_STR, &strioc_if) < 0){
1746
        syslog (LOG_ERR, "Can't set ifname to arp\n");
1747
    }
1748

    
1749
    if((ip_muxid = ioctl(ip_fd, I_LINK, if_fd)) < 0){
1750
       syslog(LOG_ERR, "Can't link TAP device to IP");
1751
       return -1;
1752
    }
1753

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

    
1757
    close (if_fd);
1758

    
1759
    memset(&ifr, 0x0, sizeof(ifr));
1760
    pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
1761
    ifr.lifr_ip_muxid  = ip_muxid;
1762
    ifr.lifr_arp_muxid = arp_muxid;
1763

    
1764
    if (ioctl (ip_fd, SIOCSLIFMUXID, &ifr) < 0)
1765
    {
1766
      ioctl (ip_fd, I_PUNLINK , arp_muxid);
1767
      ioctl (ip_fd, I_PUNLINK, ip_muxid);
1768
      syslog (LOG_ERR, "Can't set multiplexor id");
1769
    }
1770

    
1771
    snprintf(dev, dev_size, "tap%d", ppa);
1772
    return tap_fd;
1773
}
1774

    
1775
static int tap_open(char *ifname, int ifname_size,
1776
                    int *vnet_hdr, int vnet_hdr_required)
1777
{
1778
    char  dev[10]="";
1779
    int fd;
1780
    if( (fd = tap_alloc(dev, sizeof(dev))) < 0 ){
1781
       fprintf(stderr, "Cannot allocate TAP device\n");
1782
       return -1;
1783
    }
1784
    pstrcpy(ifname, ifname_size, dev);
1785
    fcntl(fd, F_SETFL, O_NONBLOCK);
1786
    return fd;
1787
}
1788
#elif defined (_AIX)
1789
static int tap_open(char *ifname, int ifname_size,
1790
                    int *vnet_hdr, int vnet_hdr_required)
1791
{
1792
    fprintf (stderr, "no tap on AIX\n");
1793
    return -1;
1794
}
1795
#else
1796
static int tap_open(char *ifname, int ifname_size,
1797
                    int *vnet_hdr, int vnet_hdr_required)
1798
{
1799
    struct ifreq ifr;
1800
    int fd, ret;
1801

    
1802
    TFR(fd = open("/dev/net/tun", O_RDWR));
1803
    if (fd < 0) {
1804
        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
1805
        return -1;
1806
    }
1807
    memset(&ifr, 0, sizeof(ifr));
1808
    ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
1809

    
1810
    if (*vnet_hdr) {
1811
        unsigned int features;
1812

    
1813
        if (ioctl(fd, TUNGETFEATURES, &features) == 0 &&
1814
            features & IFF_VNET_HDR) {
1815
            *vnet_hdr = 1;
1816
            ifr.ifr_flags |= IFF_VNET_HDR;
1817
        }
1818

    
1819
        if (vnet_hdr_required && !*vnet_hdr) {
1820
            qemu_error("vnet_hdr=1 requested, but no kernel "
1821
                       "support for IFF_VNET_HDR available");
1822
            close(fd);
1823
            return -1;
1824
        }
1825
    }
1826

    
1827
    if (ifname[0] != '\0')
1828
        pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
1829
    else
1830
        pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
1831
    ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
1832
    if (ret != 0) {
1833
        fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
1834
        close(fd);
1835
        return -1;
1836
    }
1837
    pstrcpy(ifname, ifname_size, ifr.ifr_name);
1838
    fcntl(fd, F_SETFL, O_NONBLOCK);
1839
    return fd;
1840
}
1841
#endif
1842

    
1843
static int launch_script(const char *setup_script, const char *ifname, int fd)
1844
{
1845
    sigset_t oldmask, mask;
1846
    int pid, status;
1847
    char *args[3];
1848
    char **parg;
1849

    
1850
    sigemptyset(&mask);
1851
    sigaddset(&mask, SIGCHLD);
1852
    sigprocmask(SIG_BLOCK, &mask, &oldmask);
1853

    
1854
    /* try to launch network script */
1855
    pid = fork();
1856
    if (pid == 0) {
1857
        int open_max = sysconf(_SC_OPEN_MAX), i;
1858

    
1859
        for (i = 0; i < open_max; i++) {
1860
            if (i != STDIN_FILENO &&
1861
                i != STDOUT_FILENO &&
1862
                i != STDERR_FILENO &&
1863
                i != fd) {
1864
                close(i);
1865
            }
1866
        }
1867
        parg = args;
1868
        *parg++ = (char *)setup_script;
1869
        *parg++ = (char *)ifname;
1870
        *parg++ = NULL;
1871
        execv(setup_script, args);
1872
        _exit(1);
1873
    } else if (pid > 0) {
1874
        while (waitpid(pid, &status, 0) != pid) {
1875
            /* loop */
1876
        }
1877
        sigprocmask(SIG_SETMASK, &oldmask, NULL);
1878

    
1879
        if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
1880
            return 0;
1881
        }
1882
    }
1883
    fprintf(stderr, "%s: could not launch network script\n", setup_script);
1884
    return -1;
1885
}
1886

    
1887
static int net_tap_init(QemuOpts *opts, int *vnet_hdr)
1888
{
1889
    int fd, vnet_hdr_required;
1890
    char ifname[128] = {0,};
1891
    const char *setup_script;
1892

    
1893
    if (qemu_opt_get(opts, "ifname")) {
1894
        pstrcpy(ifname, sizeof(ifname), qemu_opt_get(opts, "ifname"));
1895
    }
1896

    
1897
    *vnet_hdr = qemu_opt_get_bool(opts, "vnet_hdr", 1);
1898
    if (qemu_opt_get(opts, "vnet_hdr")) {
1899
        vnet_hdr_required = *vnet_hdr;
1900
    } else {
1901
        vnet_hdr_required = 0;
1902
    }
1903

    
1904
    TFR(fd = tap_open(ifname, sizeof(ifname), vnet_hdr, vnet_hdr_required));
1905
    if (fd < 0) {
1906
        return -1;
1907
    }
1908

    
1909
    setup_script = qemu_opt_get(opts, "script");
1910
    if (setup_script &&
1911
        setup_script[0] != '\0' &&
1912
        strcmp(setup_script, "no") != 0 &&
1913
        launch_script(setup_script, ifname, fd)) {
1914
        close(fd);
1915
        return -1;
1916
    }
1917

    
1918
    qemu_opt_set(opts, "ifname", ifname);
1919

    
1920
    return fd;
1921
}
1922

    
1923
#endif /* !_WIN32 */
1924

    
1925
#if defined(CONFIG_VDE)
1926
typedef struct VDEState {
1927
    VLANClientState *vc;
1928
    VDECONN *vde;
1929
} VDEState;
1930

    
1931
static void vde_to_qemu(void *opaque)
1932
{
1933
    VDEState *s = opaque;
1934
    uint8_t buf[4096];
1935
    int size;
1936

    
1937
    size = vde_recv(s->vde, (char *)buf, sizeof(buf), 0);
1938
    if (size > 0) {
1939
        qemu_send_packet(s->vc, buf, size);
1940
    }
1941
}
1942

    
1943
static ssize_t vde_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1944
{
1945
    VDEState *s = vc->opaque;
1946
    ssize_t ret;
1947

    
1948
    do {
1949
      ret = vde_send(s->vde, (const char *)buf, size, 0);
1950
    } while (ret < 0 && errno == EINTR);
1951

    
1952
    return ret;
1953
}
1954

    
1955
static void vde_cleanup(VLANClientState *vc)
1956
{
1957
    VDEState *s = vc->opaque;
1958
    qemu_set_fd_handler(vde_datafd(s->vde), NULL, NULL, NULL);
1959
    vde_close(s->vde);
1960
    qemu_free(s);
1961
}
1962

    
1963
static int net_vde_init(VLANState *vlan, const char *model,
1964
                        const char *name, const char *sock,
1965
                        int port, const char *group, int mode)
1966
{
1967
    VDEState *s;
1968
    char *init_group = (char *)group;
1969
    char *init_sock = (char *)sock;
1970

    
1971
    struct vde_open_args args = {
1972
        .port = port,
1973
        .group = init_group,
1974
        .mode = mode,
1975
    };
1976

    
1977
    s = qemu_mallocz(sizeof(VDEState));
1978
    s->vde = vde_open(init_sock, (char *)"QEMU", &args);
1979
    if (!s->vde){
1980
        free(s);
1981
        return -1;
1982
    }
1983
    s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_VDE,
1984
                                 vlan, NULL, model, name, NULL,
1985
                                 vde_receive, NULL, NULL,
1986
                                 vde_cleanup, s);
1987
    qemu_set_fd_handler(vde_datafd(s->vde), vde_to_qemu, NULL, s);
1988
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), "sock=%s,fd=%d",
1989
             sock, vde_datafd(s->vde));
1990
    return 0;
1991
}
1992
#endif
1993

    
1994
/* network connection */
1995
typedef struct NetSocketState {
1996
    VLANClientState *vc;
1997
    int fd;
1998
    int state; /* 0 = getting length, 1 = getting data */
1999
    unsigned int index;
2000
    unsigned int packet_len;
2001
    uint8_t buf[4096];
2002
    struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
2003
} NetSocketState;
2004

    
2005
typedef struct NetSocketListenState {
2006
    VLANState *vlan;
2007
    char *model;
2008
    char *name;
2009
    int fd;
2010
} NetSocketListenState;
2011

    
2012
/* XXX: we consider we can send the whole packet without blocking */
2013
static ssize_t net_socket_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
2014
{
2015
    NetSocketState *s = vc->opaque;
2016
    uint32_t len;
2017
    len = htonl(size);
2018

    
2019
    send_all(s->fd, (const uint8_t *)&len, sizeof(len));
2020
    return send_all(s->fd, buf, size);
2021
}
2022

    
2023
static ssize_t net_socket_receive_dgram(VLANClientState *vc, const uint8_t *buf, size_t size)
2024
{
2025
    NetSocketState *s = vc->opaque;
2026

    
2027
    return sendto(s->fd, (const void *)buf, size, 0,
2028
                  (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
2029
}
2030

    
2031
static void net_socket_send(void *opaque)
2032
{
2033
    NetSocketState *s = opaque;
2034
    int size, err;
2035
    unsigned l;
2036
    uint8_t buf1[4096];
2037
    const uint8_t *buf;
2038

    
2039
    size = recv(s->fd, (void *)buf1, sizeof(buf1), 0);
2040
    if (size < 0) {
2041
        err = socket_error();
2042
        if (err != EWOULDBLOCK)
2043
            goto eoc;
2044
    } else if (size == 0) {
2045
        /* end of connection */
2046
    eoc:
2047
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
2048
        closesocket(s->fd);
2049
        return;
2050
    }
2051
    buf = buf1;
2052
    while (size > 0) {
2053
        /* reassemble a packet from the network */
2054
        switch(s->state) {
2055
        case 0:
2056
            l = 4 - s->index;
2057
            if (l > size)
2058
                l = size;
2059
            memcpy(s->buf + s->index, buf, l);
2060
            buf += l;
2061
            size -= l;
2062
            s->index += l;
2063
            if (s->index == 4) {
2064
                /* got length */
2065
                s->packet_len = ntohl(*(uint32_t *)s->buf);
2066
                s->index = 0;
2067
                s->state = 1;
2068
            }
2069
            break;
2070
        case 1:
2071
            l = s->packet_len - s->index;
2072
            if (l > size)
2073
                l = size;
2074
            if (s->index + l <= sizeof(s->buf)) {
2075
                memcpy(s->buf + s->index, buf, l);
2076
            } else {
2077
                fprintf(stderr, "serious error: oversized packet received,"
2078
                    "connection terminated.\n");
2079
                s->state = 0;
2080
                goto eoc;
2081
            }
2082

    
2083
            s->index += l;
2084
            buf += l;
2085
            size -= l;
2086
            if (s->index >= s->packet_len) {
2087
                qemu_send_packet(s->vc, s->buf, s->packet_len);
2088
                s->index = 0;
2089
                s->state = 0;
2090
            }
2091
            break;
2092
        }
2093
    }
2094
}
2095

    
2096
static void net_socket_send_dgram(void *opaque)
2097
{
2098
    NetSocketState *s = opaque;
2099
    int size;
2100

    
2101
    size = recv(s->fd, (void *)s->buf, sizeof(s->buf), 0);
2102
    if (size < 0)
2103
        return;
2104
    if (size == 0) {
2105
        /* end of connection */
2106
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
2107
        return;
2108
    }
2109
    qemu_send_packet(s->vc, s->buf, size);
2110
}
2111

    
2112
static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
2113
{
2114
    struct ip_mreq imr;
2115
    int fd;
2116
    int val, ret;
2117
    if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
2118
        fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
2119
                inet_ntoa(mcastaddr->sin_addr),
2120
                (int)ntohl(mcastaddr->sin_addr.s_addr));
2121
        return -1;
2122

    
2123
    }
2124
    fd = socket(PF_INET, SOCK_DGRAM, 0);
2125
    if (fd < 0) {
2126
        perror("socket(PF_INET, SOCK_DGRAM)");
2127
        return -1;
2128
    }
2129

    
2130
    val = 1;
2131
    ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
2132
                   (const char *)&val, sizeof(val));
2133
    if (ret < 0) {
2134
        perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
2135
        goto fail;
2136
    }
2137

    
2138
    ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
2139
    if (ret < 0) {
2140
        perror("bind");
2141
        goto fail;
2142
    }
2143

    
2144
    /* Add host to multicast group */
2145
    imr.imr_multiaddr = mcastaddr->sin_addr;
2146
    imr.imr_interface.s_addr = htonl(INADDR_ANY);
2147

    
2148
    ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
2149
                     (const char *)&imr, sizeof(struct ip_mreq));
2150
    if (ret < 0) {
2151
        perror("setsockopt(IP_ADD_MEMBERSHIP)");
2152
        goto fail;
2153
    }
2154

    
2155
    /* Force mcast msgs to loopback (eg. several QEMUs in same host */
2156
    val = 1;
2157
    ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
2158
                   (const char *)&val, sizeof(val));
2159
    if (ret < 0) {
2160
        perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
2161
        goto fail;
2162
    }
2163

    
2164
    socket_set_nonblock(fd);
2165
    return fd;
2166
fail:
2167
    if (fd >= 0)
2168
        closesocket(fd);
2169
    return -1;
2170
}
2171

    
2172
static void net_socket_cleanup(VLANClientState *vc)
2173
{
2174
    NetSocketState *s = vc->opaque;
2175
    qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
2176
    close(s->fd);
2177
    qemu_free(s);
2178
}
2179

    
2180
static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan,
2181
                                                const char *model,
2182
                                                const char *name,
2183
                                                int fd, int is_connected)
2184
{
2185
    struct sockaddr_in saddr;
2186
    int newfd;
2187
    socklen_t saddr_len;
2188
    NetSocketState *s;
2189

    
2190
    /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
2191
     * Because this may be "shared" socket from a "master" process, datagrams would be recv()
2192
     * by ONLY ONE process: we must "clone" this dgram socket --jjo
2193
     */
2194

    
2195
    if (is_connected) {
2196
        if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
2197
            /* must be bound */
2198
            if (saddr.sin_addr.s_addr==0) {
2199
                fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
2200
                        fd);
2201
                return NULL;
2202
            }
2203
            /* clone dgram socket */
2204
            newfd = net_socket_mcast_create(&saddr);
2205
            if (newfd < 0) {
2206
                /* error already reported by net_socket_mcast_create() */
2207
                close(fd);
2208
                return NULL;
2209
            }
2210
            /* clone newfd to fd, close newfd */
2211
            dup2(newfd, fd);
2212
            close(newfd);
2213

    
2214
        } else {
2215
            fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
2216
                    fd, strerror(errno));
2217
            return NULL;
2218
        }
2219
    }
2220

    
2221
    s = qemu_mallocz(sizeof(NetSocketState));
2222
    s->fd = fd;
2223

    
2224
    s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_SOCKET,
2225
                                 vlan, NULL, model, name, NULL,
2226
                                 net_socket_receive_dgram, NULL, NULL,
2227
                                 net_socket_cleanup, s);
2228
    qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
2229

    
2230
    /* mcast: save bound address as dst */
2231
    if (is_connected) s->dgram_dst=saddr;
2232

    
2233
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2234
            "socket: fd=%d (%s mcast=%s:%d)",
2235
            fd, is_connected? "cloned" : "",
2236
            inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2237
    return s;
2238
}
2239

    
2240
static void net_socket_connect(void *opaque)
2241
{
2242
    NetSocketState *s = opaque;
2243
    qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
2244
}
2245

    
2246
static NetSocketState *net_socket_fd_init_stream(VLANState *vlan,
2247
                                                 const char *model,
2248
                                                 const char *name,
2249
                                                 int fd, int is_connected)
2250
{
2251
    NetSocketState *s;
2252
    s = qemu_mallocz(sizeof(NetSocketState));
2253
    s->fd = fd;
2254
    s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_SOCKET,
2255
                                 vlan, NULL, model, name, NULL,
2256
                                 net_socket_receive, NULL, NULL,
2257
                                 net_socket_cleanup, s);
2258
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2259
             "socket: fd=%d", fd);
2260
    if (is_connected) {
2261
        net_socket_connect(s);
2262
    } else {
2263
        qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
2264
    }
2265
    return s;
2266
}
2267

    
2268
static NetSocketState *net_socket_fd_init(VLANState *vlan,
2269
                                          const char *model, const char *name,
2270
                                          int fd, int is_connected)
2271
{
2272
    int so_type = -1, optlen=sizeof(so_type);
2273

    
2274
    if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type,
2275
        (socklen_t *)&optlen)< 0) {
2276
        fprintf(stderr, "qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n", fd);
2277
        return NULL;
2278
    }
2279
    switch(so_type) {
2280
    case SOCK_DGRAM:
2281
        return net_socket_fd_init_dgram(vlan, model, name, fd, is_connected);
2282
    case SOCK_STREAM:
2283
        return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
2284
    default:
2285
        /* who knows ... this could be a eg. a pty, do warn and continue as stream */
2286
        fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
2287
        return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
2288
    }
2289
    return NULL;
2290
}
2291

    
2292
static void net_socket_accept(void *opaque)
2293
{
2294
    NetSocketListenState *s = opaque;
2295
    NetSocketState *s1;
2296
    struct sockaddr_in saddr;
2297
    socklen_t len;
2298
    int fd;
2299

    
2300
    for(;;) {
2301
        len = sizeof(saddr);
2302
        fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
2303
        if (fd < 0 && errno != EINTR) {
2304
            return;
2305
        } else if (fd >= 0) {
2306
            break;
2307
        }
2308
    }
2309
    s1 = net_socket_fd_init(s->vlan, s->model, s->name, fd, 1);
2310
    if (!s1) {
2311
        closesocket(fd);
2312
    } else {
2313
        snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
2314
                 "socket: connection from %s:%d",
2315
                 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2316
    }
2317
}
2318

    
2319
static int net_socket_listen_init(VLANState *vlan,
2320
                                  const char *model,
2321
                                  const char *name,
2322
                                  const char *host_str)
2323
{
2324
    NetSocketListenState *s;
2325
    int fd, val, ret;
2326
    struct sockaddr_in saddr;
2327

    
2328
    if (parse_host_port(&saddr, host_str) < 0)
2329
        return -1;
2330

    
2331
    s = qemu_mallocz(sizeof(NetSocketListenState));
2332

    
2333
    fd = socket(PF_INET, SOCK_STREAM, 0);
2334
    if (fd < 0) {
2335
        perror("socket");
2336
        return -1;
2337
    }
2338
    socket_set_nonblock(fd);
2339

    
2340
    /* allow fast reuse */
2341
    val = 1;
2342
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
2343

    
2344
    ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2345
    if (ret < 0) {
2346
        perror("bind");
2347
        return -1;
2348
    }
2349
    ret = listen(fd, 0);
2350
    if (ret < 0) {
2351
        perror("listen");
2352
        return -1;
2353
    }
2354
    s->vlan = vlan;
2355
    s->model = qemu_strdup(model);
2356
    s->name = name ? qemu_strdup(name) : NULL;
2357
    s->fd = fd;
2358
    qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
2359
    return 0;
2360
}
2361

    
2362
static int net_socket_connect_init(VLANState *vlan,
2363
                                   const char *model,
2364
                                   const char *name,
2365
                                   const char *host_str)
2366
{
2367
    NetSocketState *s;
2368
    int fd, connected, ret, err;
2369
    struct sockaddr_in saddr;
2370

    
2371
    if (parse_host_port(&saddr, host_str) < 0)
2372
        return -1;
2373

    
2374
    fd = socket(PF_INET, SOCK_STREAM, 0);
2375
    if (fd < 0) {
2376
        perror("socket");
2377
        return -1;
2378
    }
2379
    socket_set_nonblock(fd);
2380

    
2381
    connected = 0;
2382
    for(;;) {
2383
        ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2384
        if (ret < 0) {
2385
            err = socket_error();
2386
            if (err == EINTR || err == EWOULDBLOCK) {
2387
            } else if (err == EINPROGRESS) {
2388
                break;
2389
#ifdef _WIN32
2390
            } else if (err == WSAEALREADY) {
2391
                break;
2392
#endif
2393
            } else {
2394
                perror("connect");
2395
                closesocket(fd);
2396
                return -1;
2397
            }
2398
        } else {
2399
            connected = 1;
2400
            break;
2401
        }
2402
    }
2403
    s = net_socket_fd_init(vlan, model, name, fd, connected);
2404
    if (!s)
2405
        return -1;
2406
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2407
             "socket: connect to %s:%d",
2408
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2409
    return 0;
2410
}
2411

    
2412
static int net_socket_mcast_init(VLANState *vlan,
2413
                                 const char *model,
2414
                                 const char *name,
2415
                                 const char *host_str)
2416
{
2417
    NetSocketState *s;
2418
    int fd;
2419
    struct sockaddr_in saddr;
2420

    
2421
    if (parse_host_port(&saddr, host_str) < 0)
2422
        return -1;
2423

    
2424

    
2425
    fd = net_socket_mcast_create(&saddr);
2426
    if (fd < 0)
2427
        return -1;
2428

    
2429
    s = net_socket_fd_init(vlan, model, name, fd, 0);
2430
    if (!s)
2431
        return -1;
2432

    
2433
    s->dgram_dst = saddr;
2434

    
2435
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2436
             "socket: mcast=%s:%d",
2437
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2438
    return 0;
2439

    
2440
}
2441

    
2442
typedef struct DumpState {
2443
    VLANClientState *pcap_vc;
2444
    int fd;
2445
    int pcap_caplen;
2446
} DumpState;
2447

    
2448
#define PCAP_MAGIC 0xa1b2c3d4
2449

    
2450
struct pcap_file_hdr {
2451
    uint32_t magic;
2452
    uint16_t version_major;
2453
    uint16_t version_minor;
2454
    int32_t thiszone;
2455
    uint32_t sigfigs;
2456
    uint32_t snaplen;
2457
    uint32_t linktype;
2458
};
2459

    
2460
struct pcap_sf_pkthdr {
2461
    struct {
2462
        int32_t tv_sec;
2463
        int32_t tv_usec;
2464
    } ts;
2465
    uint32_t caplen;
2466
    uint32_t len;
2467
};
2468

    
2469
static ssize_t dump_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
2470
{
2471
    DumpState *s = vc->opaque;
2472
    struct pcap_sf_pkthdr hdr;
2473
    int64_t ts;
2474
    int caplen;
2475

    
2476
    /* Early return in case of previous error. */
2477
    if (s->fd < 0) {
2478
        return size;
2479
    }
2480

    
2481
    ts = muldiv64(qemu_get_clock(vm_clock), 1000000, get_ticks_per_sec());
2482
    caplen = size > s->pcap_caplen ? s->pcap_caplen : size;
2483

    
2484
    hdr.ts.tv_sec = ts / 1000000;
2485
    hdr.ts.tv_usec = ts % 1000000;
2486
    hdr.caplen = caplen;
2487
    hdr.len = size;
2488
    if (write(s->fd, &hdr, sizeof(hdr)) != sizeof(hdr) ||
2489
        write(s->fd, buf, caplen) != caplen) {
2490
        qemu_log("-net dump write error - stop dump\n");
2491
        close(s->fd);
2492
        s->fd = -1;
2493
    }
2494

    
2495
    return size;
2496
}
2497

    
2498
static void net_dump_cleanup(VLANClientState *vc)
2499
{
2500
    DumpState *s = vc->opaque;
2501

    
2502
    close(s->fd);
2503
    qemu_free(s);
2504
}
2505

    
2506
static int net_dump_init(VLANState *vlan, const char *device,
2507
                         const char *name, const char *filename, int len)
2508
{
2509
    struct pcap_file_hdr hdr;
2510
    DumpState *s;
2511

    
2512
    s = qemu_malloc(sizeof(DumpState));
2513

    
2514
    s->fd = open(filename, O_CREAT | O_WRONLY | O_BINARY, 0644);
2515
    if (s->fd < 0) {
2516
        qemu_error("-net dump: can't open %s\n", filename);
2517
        return -1;
2518
    }
2519

    
2520
    s->pcap_caplen = len;
2521

    
2522
    hdr.magic = PCAP_MAGIC;
2523
    hdr.version_major = 2;
2524
    hdr.version_minor = 4;
2525
    hdr.thiszone = 0;
2526
    hdr.sigfigs = 0;
2527
    hdr.snaplen = s->pcap_caplen;
2528
    hdr.linktype = 1;
2529

    
2530
    if (write(s->fd, &hdr, sizeof(hdr)) < sizeof(hdr)) {
2531
        qemu_error("-net dump write error: %s\n", strerror(errno));
2532
        close(s->fd);
2533
        qemu_free(s);
2534
        return -1;
2535
    }
2536

    
2537
    s->pcap_vc = qemu_new_vlan_client(NET_CLIENT_TYPE_DUMP,
2538
                                      vlan, NULL, device, name, NULL,
2539
                                      dump_receive, NULL, NULL,
2540
                                      net_dump_cleanup, s);
2541
    snprintf(s->pcap_vc->info_str, sizeof(s->pcap_vc->info_str),
2542
             "dump to %s (len=%d)", filename, len);
2543
    return 0;
2544
}
2545

    
2546
/* find or alloc a new VLAN */
2547
VLANState *qemu_find_vlan(int id, int allocate)
2548
{
2549
    VLANState *vlan;
2550

    
2551
    QTAILQ_FOREACH(vlan, &vlans, next) {
2552
        if (vlan->id == id) {
2553
            return vlan;
2554
        }
2555
    }
2556

    
2557
    if (!allocate) {
2558
        return NULL;
2559
    }
2560

    
2561
    vlan = qemu_mallocz(sizeof(VLANState));
2562
    vlan->id = id;
2563
    QTAILQ_INIT(&vlan->clients);
2564

    
2565
    vlan->send_queue = qemu_new_net_queue(qemu_vlan_deliver_packet,
2566
                                          qemu_vlan_deliver_packet_iov,
2567
                                          vlan);
2568

    
2569
    QTAILQ_INSERT_TAIL(&vlans, vlan, next);
2570

    
2571
    return vlan;
2572
}
2573

    
2574
VLANClientState *qemu_find_netdev(const char *id)
2575
{
2576
    VLANClientState *vc;
2577

    
2578
    QTAILQ_FOREACH(vc, &non_vlan_clients, next) {
2579
        if (!strcmp(vc->name, id)) {
2580
            return vc;
2581
        }
2582
    }
2583

    
2584
    return NULL;
2585
}
2586

    
2587
static int nic_get_free_idx(void)
2588
{
2589
    int index;
2590

    
2591
    for (index = 0; index < MAX_NICS; index++)
2592
        if (!nd_table[index].used)
2593
            return index;
2594
    return -1;
2595
}
2596

    
2597
int qemu_show_nic_models(const char *arg, const char *const *models)
2598
{
2599
    int i;
2600

    
2601
    if (!arg || strcmp(arg, "?"))
2602
        return 0;
2603

    
2604
    fprintf(stderr, "qemu: Supported NIC models: ");
2605
    for (i = 0 ; models[i]; i++)
2606
        fprintf(stderr, "%s%c", models[i], models[i+1] ? ',' : '\n');
2607
    return 1;
2608
}
2609

    
2610
void qemu_check_nic_model(NICInfo *nd, const char *model)
2611
{
2612
    const char *models[2];
2613

    
2614
    models[0] = model;
2615
    models[1] = NULL;
2616

    
2617
    if (qemu_show_nic_models(nd->model, models))
2618
        exit(0);
2619
    if (qemu_find_nic_model(nd, models, model) < 0)
2620
        exit(1);
2621
}
2622

    
2623
int qemu_find_nic_model(NICInfo *nd, const char * const *models,
2624
                        const char *default_model)
2625
{
2626
    int i;
2627

    
2628
    if (!nd->model)
2629
        nd->model = qemu_strdup(default_model);
2630

    
2631
    for (i = 0 ; models[i]; i++) {
2632
        if (strcmp(nd->model, models[i]) == 0)
2633
            return i;
2634
    }
2635

    
2636
    qemu_error("qemu: Unsupported NIC model: %s\n", nd->model);
2637
    return -1;
2638
}
2639

    
2640
static int net_handle_fd_param(Monitor *mon, const char *param)
2641
{
2642
    if (!qemu_isdigit(param[0])) {
2643
        int fd;
2644

    
2645
        fd = monitor_get_fd(mon, param);
2646
        if (fd == -1) {
2647
            qemu_error("No file descriptor named %s found", param);
2648
            return -1;
2649
        }
2650

    
2651
        return fd;
2652
    } else {
2653
        return strtol(param, NULL, 0);
2654
    }
2655
}
2656

    
2657
static int net_init_nic(QemuOpts *opts,
2658
                        Monitor *mon,
2659
                        const char *name,
2660
                        VLANState *vlan)
2661
{
2662
    int idx;
2663
    NICInfo *nd;
2664
    const char *netdev;
2665

    
2666
    idx = nic_get_free_idx();
2667
    if (idx == -1 || nb_nics >= MAX_NICS) {
2668
        qemu_error("Too Many NICs\n");
2669
        return -1;
2670
    }
2671

    
2672
    nd = &nd_table[idx];
2673

    
2674
    memset(nd, 0, sizeof(*nd));
2675

    
2676
    if ((netdev = qemu_opt_get(opts, "netdev"))) {
2677
        nd->netdev = qemu_find_netdev(netdev);
2678
        if (!nd->netdev) {
2679
            qemu_error("netdev '%s' not found\n", netdev);
2680
            return -1;
2681
        }
2682
    } else {
2683
        assert(vlan);
2684
        nd->vlan = vlan;
2685
    }
2686
    if (name) {
2687
        nd->name = qemu_strdup(name);
2688
    }
2689
    if (qemu_opt_get(opts, "model")) {
2690
        nd->model = qemu_strdup(qemu_opt_get(opts, "model"));
2691
    }
2692
    if (qemu_opt_get(opts, "addr")) {
2693
        nd->devaddr = qemu_strdup(qemu_opt_get(opts, "addr"));
2694
    }
2695

    
2696
    nd->macaddr[0] = 0x52;
2697
    nd->macaddr[1] = 0x54;
2698
    nd->macaddr[2] = 0x00;
2699
    nd->macaddr[3] = 0x12;
2700
    nd->macaddr[4] = 0x34;
2701
    nd->macaddr[5] = 0x56 + idx;
2702

    
2703
    if (qemu_opt_get(opts, "macaddr") &&
2704
        parse_macaddr(nd->macaddr, qemu_opt_get(opts, "macaddr")) < 0) {
2705
        qemu_error("invalid syntax for ethernet address\n");
2706
        return -1;
2707
    }
2708

    
2709
    nd->nvectors = qemu_opt_get_number(opts, "vectors", NIC_NVECTORS_UNSPECIFIED);
2710
    if (nd->nvectors != NIC_NVECTORS_UNSPECIFIED &&
2711
        (nd->nvectors < 0 || nd->nvectors > 0x7ffffff)) {
2712
        qemu_error("invalid # of vectors: %d\n", nd->nvectors);
2713
        return -1;
2714
    }
2715

    
2716
    nd->used = 1;
2717
    if (vlan) {
2718
        nd->vlan->nb_guest_devs++;
2719
    }
2720
    nb_nics++;
2721

    
2722
    return idx;
2723
}
2724

    
2725
#if defined(CONFIG_SLIRP)
2726
static int net_init_slirp_configs(const char *name, const char *value, void *opaque)
2727
{
2728
    struct slirp_config_str *config;
2729

    
2730
    if (strcmp(name, "hostfwd") != 0 && strcmp(name, "guestfwd") != 0) {
2731
        return 0;
2732
    }
2733

    
2734
    config = qemu_mallocz(sizeof(*config));
2735

    
2736
    pstrcpy(config->str, sizeof(config->str), value);
2737

    
2738
    if (!strcmp(name, "hostfwd")) {
2739
        config->flags = SLIRP_CFG_HOSTFWD;
2740
    }
2741

    
2742
    config->next = slirp_configs;
2743
    slirp_configs = config;
2744

    
2745
    return 0;
2746
}
2747

    
2748
static int net_init_slirp(QemuOpts *opts,
2749
                          Monitor *mon,
2750
                          const char *name,
2751
                          VLANState *vlan)
2752
{
2753
    struct slirp_config_str *config;
2754
    const char *vhost;
2755
    const char *vhostname;
2756
    const char *vdhcp_start;
2757
    const char *vnamesrv;
2758
    const char *tftp_export;
2759
    const char *bootfile;
2760
    const char *smb_export;
2761
    const char *vsmbsrv;
2762
    char *vnet = NULL;
2763
    int restricted = 0;
2764
    int ret;
2765

    
2766
    vhost       = qemu_opt_get(opts, "host");
2767
    vhostname   = qemu_opt_get(opts, "hostname");
2768
    vdhcp_start = qemu_opt_get(opts, "dhcpstart");
2769
    vnamesrv    = qemu_opt_get(opts, "dns");
2770
    tftp_export = qemu_opt_get(opts, "tftp");
2771
    bootfile    = qemu_opt_get(opts, "bootfile");
2772
    smb_export  = qemu_opt_get(opts, "smb");
2773
    vsmbsrv     = qemu_opt_get(opts, "smbserver");
2774

    
2775
    if (qemu_opt_get(opts, "ip")) {
2776
        const char *ip = qemu_opt_get(opts, "ip");
2777
        int l = strlen(ip) + strlen("/24") + 1;
2778

    
2779
        vnet = qemu_malloc(l);
2780

    
2781
        /* emulate legacy ip= parameter */
2782
        pstrcpy(vnet, l, ip);
2783
        pstrcat(vnet, l, "/24");
2784
    }
2785

    
2786
    if (qemu_opt_get(opts, "net")) {
2787
        if (vnet) {
2788
            qemu_free(vnet);
2789
        }
2790
        vnet = qemu_strdup(qemu_opt_get(opts, "net"));
2791
    }
2792

    
2793
    if (qemu_opt_get(opts, "restrict") &&
2794
        qemu_opt_get(opts, "restrict")[0] == 'y') {
2795
        restricted = 1;
2796
    }
2797

    
2798
    qemu_opt_foreach(opts, net_init_slirp_configs, NULL, 0);
2799

    
2800
    ret = net_slirp_init(vlan, "user", name, restricted, vnet, vhost,
2801
                         vhostname, tftp_export, bootfile, vdhcp_start,
2802
                         vnamesrv, smb_export, vsmbsrv);
2803

    
2804
    while (slirp_configs) {
2805
        config = slirp_configs;
2806
        slirp_configs = config->next;
2807
        qemu_free(config);
2808
    }
2809

    
2810
    if (ret != -1 && vlan) {
2811
        vlan->nb_host_devs++;
2812
    }
2813

    
2814
    qemu_free(vnet);
2815

    
2816
    return ret;
2817
}
2818
#endif /* CONFIG_SLIRP */
2819

    
2820
#ifdef _WIN32
2821
static int net_init_tap_win32(QemuOpts *opts,
2822
                              Monitor *mon,
2823
                              const char *name,
2824
                              VLANState *vlan)
2825
{
2826
    const char *ifname;
2827

    
2828
    ifname = qemu_opt_get(opts, "ifname");
2829

    
2830
    if (!ifname) {
2831
        qemu_error("tap: no interface name\n");
2832
        return -1;
2833
    }
2834

    
2835
    if (tap_win32_init(vlan, "tap", name, ifname) == -1) {
2836
        return -1;
2837
    }
2838

    
2839
    if (vlan) {
2840
        vlan->nb_host_devs++;
2841
    }
2842

    
2843
    return 0;
2844
}
2845
#elif !defined(_AIX)
2846
static int net_init_tap(QemuOpts *opts,
2847
                        Monitor *mon,
2848
                        const char *name,
2849
                        VLANState *vlan)
2850
{
2851
    TAPState *s;
2852
    int fd, vnet_hdr;
2853

    
2854
    if (qemu_opt_get(opts, "fd")) {
2855
        if (qemu_opt_get(opts, "ifname") ||
2856
            qemu_opt_get(opts, "script") ||
2857
            qemu_opt_get(opts, "downscript") ||
2858
            qemu_opt_get(opts, "vnet_hdr")) {
2859
            qemu_error("ifname=, script=, downscript= and vnet_hdr= is invalid with fd=\n");
2860
            return -1;
2861
        }
2862

    
2863
        fd = net_handle_fd_param(mon, qemu_opt_get(opts, "fd"));
2864
        if (fd == -1) {
2865
            return -1;
2866
        }
2867

    
2868
        fcntl(fd, F_SETFL, O_NONBLOCK);
2869

    
2870
        vnet_hdr = tap_probe_vnet_hdr(fd);
2871
    } else {
2872
        if (!qemu_opt_get(opts, "script")) {
2873
            qemu_opt_set(opts, "script", DEFAULT_NETWORK_SCRIPT);
2874
        }
2875

    
2876
        if (!qemu_opt_get(opts, "downscript")) {
2877
            qemu_opt_set(opts, "downscript", DEFAULT_NETWORK_DOWN_SCRIPT);
2878
        }
2879

    
2880
        fd = net_tap_init(opts, &vnet_hdr);
2881
    }
2882

    
2883
    s = net_tap_fd_init(vlan, "tap", name, fd, vnet_hdr);
2884
    if (!s) {
2885
        close(fd);
2886
        return -1;
2887
    }
2888

    
2889
    if (tap_set_sndbuf(s, opts) < 0) {
2890
        return -1;
2891
    }
2892

    
2893
    if (qemu_opt_get(opts, "fd")) {
2894
        snprintf(s->vc->info_str, sizeof(s->vc->info_str), "fd=%d", fd);
2895
    } else {
2896
        const char *ifname, *script, *downscript;
2897

    
2898
        ifname     = qemu_opt_get(opts, "ifname");
2899
        script     = qemu_opt_get(opts, "script");
2900
        downscript = qemu_opt_get(opts, "downscript");
2901

    
2902
        snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2903
                 "ifname=%s,script=%s,downscript=%s",
2904
                 ifname, script, downscript);
2905

    
2906
        if (strcmp(downscript, "no") != 0) {
2907
            snprintf(s->down_script, sizeof(s->down_script), "%s", downscript);
2908
            snprintf(s->down_script_arg, sizeof(s->down_script_arg), "%s", ifname);
2909
        }
2910
    }
2911

    
2912
    if (vlan) {
2913
        vlan->nb_host_devs++;
2914
    }
2915

    
2916
    return 0;
2917
}
2918
#endif
2919

    
2920
static int net_init_socket(QemuOpts *opts,
2921
                           Monitor *mon,
2922
                           const char *name,
2923
                           VLANState *vlan)
2924
{
2925
    if (qemu_opt_get(opts, "fd")) {
2926
        int fd;
2927

    
2928
        if (qemu_opt_get(opts, "listen") ||
2929
            qemu_opt_get(opts, "connect") ||
2930
            qemu_opt_get(opts, "mcast")) {
2931
            qemu_error("listen=, connect= and mcast= is invalid with fd=\n");
2932
            return -1;
2933
        }
2934

    
2935
        fd = net_handle_fd_param(mon, qemu_opt_get(opts, "fd"));
2936
        if (fd == -1) {
2937
            return -1;
2938
        }
2939

    
2940
        if (!net_socket_fd_init(vlan, "socket", name, fd, 1)) {
2941
            close(fd);
2942
            return -1;
2943
        }
2944
    } else if (qemu_opt_get(opts, "listen")) {
2945
        const char *listen;
2946

    
2947
        if (qemu_opt_get(opts, "fd") ||
2948
            qemu_opt_get(opts, "connect") ||
2949
            qemu_opt_get(opts, "mcast")) {
2950
            qemu_error("fd=, connect= and mcast= is invalid with listen=\n");
2951
            return -1;
2952
        }
2953

    
2954
        listen = qemu_opt_get(opts, "listen");
2955

    
2956
        if (net_socket_listen_init(vlan, "socket", name, listen) == -1) {
2957
            return -1;
2958
        }
2959
    } else if (qemu_opt_get(opts, "connect")) {
2960
        const char *connect;
2961

    
2962
        if (qemu_opt_get(opts, "fd") ||
2963
            qemu_opt_get(opts, "listen") ||
2964
            qemu_opt_get(opts, "mcast")) {
2965
            qemu_error("fd=, listen= and mcast= is invalid with connect=\n");
2966
            return -1;
2967
        }
2968

    
2969
        connect = qemu_opt_get(opts, "connect");
2970

    
2971
        if (net_socket_connect_init(vlan, "socket", name, connect) == -1) {
2972
            return -1;
2973
        }
2974
    } else if (qemu_opt_get(opts, "mcast")) {
2975
        const char *mcast;
2976

    
2977
        if (qemu_opt_get(opts, "fd") ||
2978
            qemu_opt_get(opts, "connect") ||
2979
            qemu_opt_get(opts, "listen")) {
2980
            qemu_error("fd=, connect= and listen= is invalid with mcast=\n");
2981
            return -1;
2982
        }
2983

    
2984
        mcast = qemu_opt_get(opts, "mcast");
2985

    
2986
        if (net_socket_mcast_init(vlan, "socket", name, mcast) == -1) {
2987
            return -1;
2988
        }
2989
    } else {
2990
        qemu_error("-socket requires fd=, listen=, connect= or mcast=\n");
2991
        return -1;
2992
    }
2993

    
2994
    if (vlan) {
2995
        vlan->nb_host_devs++;
2996
    }
2997

    
2998
    return 0;
2999
}
3000

    
3001
#ifdef CONFIG_VDE
3002
static int net_init_vde(QemuOpts *opts,
3003
                        Monitor *mon,
3004
                        const char *name,
3005
                        VLANState *vlan)
3006
{
3007
    const char *sock;
3008
    const char *group;
3009
    int port, mode;
3010

    
3011
    sock  = qemu_opt_get(opts, "sock");
3012
    group = qemu_opt_get(opts, "group");
3013

    
3014
    port = qemu_opt_get_number(opts, "port", 0);
3015
    mode = qemu_opt_get_number(opts, "mode", 0700);
3016

    
3017
    if (net_vde_init(vlan, "vde", name, sock, port, group, mode) == -1) {
3018
        return -1;
3019
    }
3020

    
3021
    if (vlan) {
3022
        vlan->nb_host_devs++;
3023
    }
3024

    
3025
    return 0;
3026
}
3027
#endif
3028

    
3029
static int net_init_dump(QemuOpts *opts,
3030
                         Monitor *mon,
3031
                         const char *name,
3032
                         VLANState *vlan)
3033
{
3034
    int len;
3035
    const char *file;
3036
    char def_file[128];
3037

    
3038
    assert(vlan);
3039

    
3040
    file = qemu_opt_get(opts, "file");
3041
    if (!file) {
3042
        snprintf(def_file, sizeof(def_file), "qemu-vlan%d.pcap", vlan->id);
3043
        file = def_file;
3044
    }
3045

    
3046
    len = qemu_opt_get_size(opts, "len", 65536);
3047

    
3048
    return net_dump_init(vlan, "dump", name, file, len);
3049
}
3050

    
3051
#define NET_COMMON_PARAMS_DESC                     \
3052
    {                                              \
3053
        .name = "type",                            \
3054
        .type = QEMU_OPT_STRING,                   \
3055
        .help = "net client type (nic, tap etc.)", \
3056
     }, {                                          \
3057
        .name = "vlan",                            \
3058
        .type = QEMU_OPT_NUMBER,                   \
3059
        .help = "vlan number",                     \
3060
     }, {                                          \
3061
        .name = "name",                            \
3062
        .type = QEMU_OPT_STRING,                   \
3063
        .help = "identifier for monitor commands", \
3064
     }
3065

    
3066
typedef int (*net_client_init_func)(QemuOpts *opts,
3067
                                    Monitor *mon,
3068
                                    const char *name,
3069
                                    VLANState *vlan);
3070

    
3071
/* magic number, but compiler will warn if too small */
3072
#define NET_MAX_DESC 20
3073

    
3074
static struct {
3075
    const char *type;
3076
    net_client_init_func init;
3077
    QemuOptDesc desc[NET_MAX_DESC];
3078
} net_client_types[] = {
3079
    {
3080
        .type = "none",
3081
        .desc = {
3082
            NET_COMMON_PARAMS_DESC,
3083
            { /* end of list */ }
3084
        },
3085
    }, {
3086
        .type = "nic",
3087
        .init = net_init_nic,
3088
        .desc = {
3089
            NET_COMMON_PARAMS_DESC,
3090
            {
3091
                .name = "netdev",
3092
                .type = QEMU_OPT_STRING,
3093
                .help = "id of -netdev to connect to",
3094
            },
3095
            {
3096
                .name = "macaddr",
3097
                .type = QEMU_OPT_STRING,
3098
                .help = "MAC address",
3099
            }, {
3100
                .name = "model",
3101
                .type = QEMU_OPT_STRING,
3102
                .help = "device model (e1000, rtl8139, virtio etc.)",
3103
            }, {
3104
                .name = "addr",
3105
                .type = QEMU_OPT_STRING,
3106
                .help = "PCI device address",
3107
            }, {
3108
                .name = "vectors",
3109
                .type = QEMU_OPT_NUMBER,
3110
                .help = "number of MSI-x vectors, 0 to disable MSI-X",
3111
            },
3112
            { /* end of list */ }
3113
        },
3114
#ifdef CONFIG_SLIRP
3115
    }, {
3116
        .type = "user",
3117
        .init = net_init_slirp,
3118
        .desc = {
3119
            NET_COMMON_PARAMS_DESC,
3120
            {
3121
                .name = "hostname",
3122
                .type = QEMU_OPT_STRING,
3123
                .help = "client hostname reported by the builtin DHCP server",
3124
            }, {
3125
                .name = "restrict",
3126
                .type = QEMU_OPT_STRING,
3127
                .help = "isolate the guest from the host (y|yes|n|no)",
3128
            }, {
3129
                .name = "ip",
3130
                .type = QEMU_OPT_STRING,
3131
                .help = "legacy parameter, use net= instead",
3132
            }, {
3133
                .name = "net",
3134
                .type = QEMU_OPT_STRING,
3135
                .help = "IP address and optional netmask",
3136
            }, {
3137
                .name = "host",
3138
                .type = QEMU_OPT_STRING,
3139
                .help = "guest-visible address of the host",
3140
            }, {
3141
                .name = "tftp",
3142
                .type = QEMU_OPT_STRING,
3143
                .help = "root directory of the built-in TFTP server",
3144
            }, {
3145
                .name = "bootfile",
3146
                .type = QEMU_OPT_STRING,
3147
                .help = "BOOTP filename, for use with tftp=",
3148
            }, {
3149
                .name = "dhcpstart",
3150
                .type = QEMU_OPT_STRING,
3151
                .help = "the first of the 16 IPs the built-in DHCP server can assign",
3152
            }, {
3153
                .name = "dns",
3154
                .type = QEMU_OPT_STRING,
3155
                .help = "guest-visible address of the virtual nameserver",
3156
            }, {
3157
                .name = "smb",
3158
                .type = QEMU_OPT_STRING,
3159
                .help = "root directory of the built-in SMB server",
3160
            }, {
3161
                .name = "smbserver",
3162
                .type = QEMU_OPT_STRING,
3163
                .help = "IP address of the built-in SMB server",
3164
            }, {
3165
                .name = "hostfwd",
3166
                .type = QEMU_OPT_STRING,
3167
                .help = "guest port number to forward incoming TCP or UDP connections",
3168
            }, {
3169
                .name = "guestfwd",
3170
                .type = QEMU_OPT_STRING,
3171
                .help = "IP address and port to forward guest TCP connections",
3172
            },
3173
            { /* end of list */ }
3174
        },
3175
#endif
3176
#ifdef _WIN32
3177
    }, {
3178
        .type = "tap",
3179
        .init = net_init_tap_win32,
3180
        .desc = {
3181
            NET_COMMON_PARAMS_DESC,
3182
            {
3183
                .name = "ifname",
3184
                .type = QEMU_OPT_STRING,
3185
                .help = "interface name",
3186
            },
3187
            { /* end of list */ }
3188
        },
3189
#elif !defined(_AIX)
3190
    }, {
3191
        .type = "tap",
3192
        .init = net_init_tap,
3193
        .desc = {
3194
            NET_COMMON_PARAMS_DESC,
3195
            {
3196
                .name = "fd",
3197
                .type = QEMU_OPT_STRING,
3198
                .help = "file descriptor of an already opened tap",
3199
            }, {
3200
                .name = "ifname",
3201
                .type = QEMU_OPT_STRING,
3202
                .help = "interface name",
3203
            }, {
3204
                .name = "script",
3205
                .type = QEMU_OPT_STRING,
3206
                .help = "script to initialize the interface",
3207
            }, {
3208
                .name = "downscript",
3209
                .type = QEMU_OPT_STRING,
3210
                .help = "script to shut down the interface",
3211
            }, {
3212
                .name = "sndbuf",
3213
                .type = QEMU_OPT_SIZE,
3214
                .help = "send buffer limit"
3215
            }, {
3216
                .name = "vnet_hdr",
3217
                .type = QEMU_OPT_BOOL,
3218
                .help = "enable the IFF_VNET_HDR flag on the tap interface"
3219
            },
3220
            { /* end of list */ }
3221
        },
3222
#endif
3223
    }, {
3224
        .type = "socket",
3225
        .init = net_init_socket,
3226
        .desc = {
3227
            NET_COMMON_PARAMS_DESC,
3228
            {
3229
                .name = "fd",
3230
                .type = QEMU_OPT_STRING,
3231
                .help = "file descriptor of an already opened socket",
3232
            }, {
3233
                .name = "listen",
3234
                .type = QEMU_OPT_STRING,
3235
                .help = "port number, and optional hostname, to listen on",
3236
            }, {
3237
                .name = "connect",
3238
                .type = QEMU_OPT_STRING,
3239
                .help = "port number, and optional hostname, to connect to",
3240
            }, {
3241
                .name = "mcast",
3242
                .type = QEMU_OPT_STRING,
3243
                .help = "UDP multicast address and port number",
3244
            },
3245
            { /* end of list */ }
3246
        },
3247
#ifdef CONFIG_VDE
3248
    }, {
3249
        .type = "vde",
3250
        .init = net_init_vde,
3251
        .desc = {
3252
            NET_COMMON_PARAMS_DESC,
3253
            {
3254
                .name = "sock",
3255
                .type = QEMU_OPT_STRING,
3256
                .help = "socket path",
3257
            }, {
3258
                .name = "port",
3259
                .type = QEMU_OPT_NUMBER,
3260
                .help = "port number",
3261
            }, {
3262
                .name = "group",
3263
                .type = QEMU_OPT_STRING,
3264
                .help = "group owner of socket",
3265
            }, {
3266
                .name = "mode",
3267
                .type = QEMU_OPT_NUMBER,
3268
                .help = "permissions for socket",
3269
            },
3270
            { /* end of list */ }
3271
        },
3272
#endif
3273
    }, {
3274
        .type = "dump",
3275
        .init = net_init_dump,
3276
        .desc = {
3277
            NET_COMMON_PARAMS_DESC,
3278
            {
3279
                .name = "len",
3280
                .type = QEMU_OPT_SIZE,
3281
                .help = "per-packet size limit (64k default)",
3282
            }, {
3283
                .name = "file",
3284
                .type = QEMU_OPT_STRING,
3285
                .help = "dump file path (default is qemu-vlan0.pcap)",
3286
            },
3287
            { /* end of list */ }
3288
        },
3289
    },
3290
    { /* end of list */ }
3291
};
3292

    
3293
int net_client_init(Monitor *mon, QemuOpts *opts, int is_netdev)
3294
{
3295
    const char *name;
3296
    const char *type;
3297
    int i;
3298

    
3299
    type = qemu_opt_get(opts, "type");
3300
    if (!type) {
3301
        qemu_error("No type specified for -net\n");
3302
        return -1;
3303
    }
3304

    
3305
    if (is_netdev) {
3306
        if (strcmp(type, "tap") != 0 &&
3307
#ifdef CONFIG_SLIRP
3308
            strcmp(type, "user") != 0 &&
3309
#endif
3310
#ifdef CONFIG_VDE
3311
            strcmp(type, "vde") != 0 &&
3312
#endif
3313
            strcmp(type, "socket") != 0) {
3314
            qemu_error("The '%s' network backend type is not valid with -netdev\n",
3315
                       type);
3316
            return -1;
3317
        }
3318

    
3319
        if (qemu_opt_get(opts, "vlan")) {
3320
            qemu_error("The 'vlan' parameter is not valid with -netdev\n");
3321
            return -1;
3322
        }
3323
        if (qemu_opt_get(opts, "name")) {
3324
            qemu_error("The 'name' parameter is not valid with -netdev\n");
3325
            return -1;
3326
        }
3327
        if (!qemu_opts_id(opts)) {
3328
            qemu_error("The id= parameter is required with -netdev\n");
3329
            return -1;
3330
        }
3331
    }
3332

    
3333
    name = qemu_opts_id(opts);
3334
    if (!name) {
3335
        name = qemu_opt_get(opts, "name");
3336
    }
3337

    
3338
    for (i = 0; net_client_types[i].type != NULL; i++) {
3339
        if (!strcmp(net_client_types[i].type, type)) {
3340
            VLANState *vlan = NULL;
3341

    
3342
            if (qemu_opts_validate(opts, &net_client_types[i].desc[0]) == -1) {
3343
                return -1;
3344
            }
3345

    
3346
            /* Do not add to a vlan if it's a -netdev or a nic with a
3347
             * netdev= parameter. */
3348
            if (!(is_netdev ||
3349
                  (strcmp(type, "nic") == 0 && qemu_opt_get(opts, "netdev")))) {
3350
                vlan = qemu_find_vlan(qemu_opt_get_number(opts, "vlan", 0), 1);
3351
            }
3352

    
3353
            if (net_client_types[i].init) {
3354
                return net_client_types[i].init(opts, mon, name, vlan);
3355
            } else {
3356
                return 0;
3357
            }
3358
        }
3359
    }
3360

    
3361
    qemu_error("Invalid -net type '%s'\n", type);
3362
    return -1;
3363
}
3364

    
3365
void net_client_uninit(NICInfo *nd)
3366
{
3367
    if (nd->vlan) {
3368
        nd->vlan->nb_guest_devs--;
3369
    }
3370
    nb_nics--;
3371

    
3372
    qemu_free(nd->model);
3373
    qemu_free(nd->name);
3374
    qemu_free(nd->devaddr);
3375

    
3376
    nd->used = 0;
3377
}
3378

    
3379
static int net_host_check_device(const char *device)
3380
{
3381
    int i;
3382
    const char *valid_param_list[] = { "tap", "socket", "dump"
3383
#ifdef CONFIG_SLIRP
3384
                                       ,"user"
3385
#endif
3386
#ifdef CONFIG_VDE
3387
                                       ,"vde"
3388
#endif
3389
    };
3390
    for (i = 0; i < sizeof(valid_param_list) / sizeof(char *); i++) {
3391
        if (!strncmp(valid_param_list[i], device,
3392
                     strlen(valid_param_list[i])))
3393
            return 1;
3394
    }
3395

    
3396
    return 0;
3397
}
3398

    
3399
void net_host_device_add(Monitor *mon, const QDict *qdict)
3400
{
3401
    const char *device = qdict_get_str(qdict, "device");
3402
    const char *opts_str = qdict_get_try_str(qdict, "opts");
3403
    QemuOpts *opts;
3404

    
3405
    if (!net_host_check_device(device)) {
3406
        monitor_printf(mon, "invalid host network device %s\n", device);
3407
        return;
3408
    }
3409

    
3410
    opts = qemu_opts_parse(&qemu_net_opts, opts_str ? opts_str : "", NULL);
3411
    if (!opts) {
3412
        monitor_printf(mon, "parsing network options '%s' failed\n",
3413
                       opts_str ? opts_str : "");
3414
        return;
3415
    }
3416

    
3417
    qemu_opt_set(opts, "type", device);
3418

    
3419
    if (net_client_init(mon, opts, 0) < 0) {
3420
        monitor_printf(mon, "adding host network device %s failed\n", device);
3421
    }
3422
}
3423

    
3424
void net_host_device_remove(Monitor *mon, const QDict *qdict)
3425
{
3426
    VLANClientState *vc;
3427
    int vlan_id = qdict_get_int(qdict, "vlan_id");
3428
    const char *device = qdict_get_str(qdict, "device");
3429

    
3430
    vc = qemu_find_vlan_client_by_name(mon, vlan_id, device);
3431
    if (!vc) {
3432
        return;
3433
    }
3434
    if (!net_host_check_device(vc->model)) {
3435
        monitor_printf(mon, "invalid host network device %s\n", device);
3436
        return;
3437
    }
3438
    qemu_del_vlan_client(vc);
3439
}
3440

    
3441
void net_set_boot_mask(int net_boot_mask)
3442
{
3443
    int i;
3444

    
3445
    /* Only the first four NICs may be bootable */
3446
    net_boot_mask = net_boot_mask & 0xF;
3447

    
3448
    for (i = 0; i < nb_nics; i++) {
3449
        if (net_boot_mask & (1 << i)) {
3450
            nd_table[i].bootable = 1;
3451
            net_boot_mask &= ~(1 << i);
3452
        }
3453
    }
3454

    
3455
    if (net_boot_mask) {
3456
        fprintf(stderr, "Cannot boot from non-existent NIC\n");
3457
        exit(1);
3458
    }
3459
}
3460

    
3461
void do_info_network(Monitor *mon)
3462
{
3463
    VLANState *vlan;
3464

    
3465
    QTAILQ_FOREACH(vlan, &vlans, next) {
3466
        VLANClientState *vc;
3467

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

    
3470
        QTAILQ_FOREACH(vc, &vlan->clients, next) {
3471
            monitor_printf(mon, "  %s: %s\n", vc->name, vc->info_str);
3472
        }
3473
    }
3474
}
3475

    
3476
void do_set_link(Monitor *mon, const QDict *qdict)
3477
{
3478
    VLANState *vlan;
3479
    VLANClientState *vc = NULL;
3480
    const char *name = qdict_get_str(qdict, "name");
3481
    const char *up_or_down = qdict_get_str(qdict, "up_or_down");
3482

    
3483
    QTAILQ_FOREACH(vlan, &vlans, next) {
3484
        QTAILQ_FOREACH(vc, &vlan->clients, next) {
3485
            if (strcmp(vc->name, name) == 0) {
3486
                goto done;
3487
            }
3488
        }
3489
    }
3490
done:
3491

    
3492
    if (!vc) {
3493
        monitor_printf(mon, "could not find network device '%s'\n", name);
3494
        return;
3495
    }
3496

    
3497
    if (strcmp(up_or_down, "up") == 0)
3498
        vc->link_down = 0;
3499
    else if (strcmp(up_or_down, "down") == 0)
3500
        vc->link_down = 1;
3501
    else
3502
        monitor_printf(mon, "invalid link status '%s'; only 'up' or 'down' "
3503
                       "valid\n", up_or_down);
3504

    
3505
    if (vc->link_status_changed)
3506
        vc->link_status_changed(vc);
3507
}
3508

    
3509
void net_cleanup(void)
3510
{
3511
    VLANState *vlan;
3512
    VLANClientState *vc, *next_vc;
3513

    
3514
    QTAILQ_FOREACH(vlan, &vlans, next) {
3515
        QTAILQ_FOREACH_SAFE(vc, &vlan->clients, next, next_vc) {
3516
            qemu_del_vlan_client(vc);
3517
        }
3518
    }
3519

    
3520
    QTAILQ_FOREACH_SAFE(vc, &non_vlan_clients, next, next_vc) {
3521
        qemu_del_vlan_client(vc);
3522
    }
3523
}
3524

    
3525
static void net_check_clients(void)
3526
{
3527
    VLANState *vlan;
3528

    
3529
    QTAILQ_FOREACH(vlan, &vlans, next) {
3530
        if (vlan->nb_guest_devs == 0 && vlan->nb_host_devs == 0)
3531
            continue;
3532
        if (vlan->nb_guest_devs == 0)
3533
            fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id);
3534
        if (vlan->nb_host_devs == 0)
3535
            fprintf(stderr,
3536
                    "Warning: vlan %d is not connected to host network\n",
3537
                    vlan->id);
3538
    }
3539
}
3540

    
3541
static int net_init_client(QemuOpts *opts, void *dummy)
3542
{
3543
    if (net_client_init(NULL, opts, 0) < 0)
3544
        return -1;
3545
    return 0;
3546
}
3547

    
3548
static int net_init_netdev(QemuOpts *opts, void *dummy)
3549
{
3550
    return net_client_init(NULL, opts, 1);
3551
}
3552

    
3553
int net_init_clients(void)
3554
{
3555
    if (QTAILQ_EMPTY(&qemu_net_opts.head)) {
3556
        /* if no clients, we use a default config */
3557
        qemu_opts_set(&qemu_net_opts, NULL, "type", "nic");
3558
#ifdef CONFIG_SLIRP
3559
        qemu_opts_set(&qemu_net_opts, NULL, "type", "user");
3560
#endif
3561
    }
3562

    
3563
    QTAILQ_INIT(&vlans);
3564
    QTAILQ_INIT(&non_vlan_clients);
3565

    
3566
    if (qemu_opts_foreach(&qemu_netdev_opts, net_init_netdev, NULL, 1) == -1)
3567
        return -1;
3568

    
3569
    if (qemu_opts_foreach(&qemu_net_opts, net_init_client, NULL, 1) == -1) {
3570
        return -1;
3571
    }
3572

    
3573
    net_check_clients();
3574

    
3575
    return 0;
3576
}
3577

    
3578
int net_client_parse(QemuOptsList *opts_list, const char *optarg)
3579
{
3580
#if defined(CONFIG_SLIRP)
3581
    /* handle legacy -net channel,port:chr */
3582
    if (!strcmp(opts_list->name, "net") &&
3583
        !strncmp(optarg, "channel,", strlen("channel,"))) {
3584
        int ret;
3585

    
3586
        optarg += strlen("channel,");
3587

    
3588
        if (QTAILQ_EMPTY(&slirp_stacks)) {
3589
            struct slirp_config_str *config;
3590

    
3591
            config = qemu_malloc(sizeof(*config));
3592
            pstrcpy(config->str, sizeof(config->str), optarg);
3593
            config->flags = SLIRP_CFG_LEGACY;
3594
            config->next = slirp_configs;
3595
            slirp_configs = config;
3596
            ret = 0;
3597
        } else {
3598
            ret = slirp_guestfwd(QTAILQ_FIRST(&slirp_stacks), optarg, 1);
3599
        }
3600

    
3601
        return ret;
3602
    }
3603
#endif
3604
    if (!qemu_opts_parse(opts_list, optarg, "type")) {
3605
        return -1;
3606
    }
3607

    
3608
    return 0;
3609
}