Statistics
| Branch: | Revision:

root / net.c @ 6dbe553f

History | View | Annotate | Download (76.9 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 HOST_BSD etc. */
33
#include "config-host.h"
34

    
35
#ifndef _WIN32
36
#include <sys/times.h>
37
#include <sys/wait.h>
38
#include <termios.h>
39
#include <sys/mman.h>
40
#include <sys/ioctl.h>
41
#include <sys/resource.h>
42
#include <sys/socket.h>
43
#include <netinet/in.h>
44
#include <net/if.h>
45
#ifdef __NetBSD__
46
#include <net/if_tap.h>
47
#endif
48
#ifdef __linux__
49
#include <linux/if_tun.h>
50
#endif
51
#include <arpa/inet.h>
52
#include <dirent.h>
53
#include <netdb.h>
54
#include <sys/select.h>
55
#ifdef HOST_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
#ifdef _WIN32
105
#include <windows.h>
106
#include <malloc.h>
107
#include <sys/timeb.h>
108
#include <mmsystem.h>
109
#define getopt_long_only getopt_long
110
#define memalign(align, size) malloc(size)
111
#endif
112

    
113
#include "qemu-common.h"
114
#include "net.h"
115
#include "monitor.h"
116
#include "sysemu.h"
117
#include "qemu-timer.h"
118
#include "qemu-char.h"
119
#include "audio/audio.h"
120
#include "qemu_socket.h"
121
#include "qemu-log.h"
122

    
123
#if defined(CONFIG_SLIRP)
124
#include "libslirp.h"
125
#endif
126

    
127

    
128
static VLANState *first_vlan;
129

    
130
/***********************************************************/
131
/* network device redirectors */
132

    
133
#if defined(DEBUG_NET) || defined(DEBUG_SLIRP)
134
static void hex_dump(FILE *f, const uint8_t *buf, int size)
135
{
136
    int len, i, j, c;
137

    
138
    for(i=0;i<size;i+=16) {
139
        len = size - i;
140
        if (len > 16)
141
            len = 16;
142
        fprintf(f, "%08x ", i);
143
        for(j=0;j<16;j++) {
144
            if (j < len)
145
                fprintf(f, " %02x", buf[i+j]);
146
            else
147
                fprintf(f, "   ");
148
        }
149
        fprintf(f, " ");
150
        for(j=0;j<len;j++) {
151
            c = buf[i+j];
152
            if (c < ' ' || c > '~')
153
                c = '.';
154
            fprintf(f, "%c", c);
155
        }
156
        fprintf(f, "\n");
157
    }
158
}
159
#endif
160

    
161
static int parse_macaddr(uint8_t *macaddr, const char *p)
162
{
163
    int i;
164
    char *last_char;
165
    long int offset;
166

    
167
    errno = 0;
168
    offset = strtol(p, &last_char, 0);    
169
    if (0 == errno && '\0' == *last_char &&
170
            offset >= 0 && offset <= 0xFFFFFF) {
171
        macaddr[3] = (offset & 0xFF0000) >> 16;
172
        macaddr[4] = (offset & 0xFF00) >> 8;
173
        macaddr[5] = offset & 0xFF;
174
        return 0;
175
    } else {
176
        for(i = 0; i < 6; i++) {
177
            macaddr[i] = strtol(p, (char **)&p, 16);
178
            if (i == 5) {
179
                if (*p != '\0')
180
                    return -1;
181
            } else {
182
                if (*p != ':' && *p != '-')
183
                    return -1;
184
                p++;
185
            }
186
        }
187
        return 0;    
188
    }
189

    
190
    return -1;
191
}
192

    
193
static int get_str_sep(char *buf, int buf_size, const char **pp, int sep)
194
{
195
    const char *p, *p1;
196
    int len;
197
    p = *pp;
198
    p1 = strchr(p, sep);
199
    if (!p1)
200
        return -1;
201
    len = p1 - p;
202
    p1++;
203
    if (buf_size > 0) {
204
        if (len > buf_size - 1)
205
            len = buf_size - 1;
206
        memcpy(buf, p, len);
207
        buf[len] = '\0';
208
    }
209
    *pp = p1;
210
    return 0;
211
}
212

    
213
int parse_host_src_port(struct sockaddr_in *haddr,
214
                        struct sockaddr_in *saddr,
215
                        const char *input_str)
216
{
217
    char *str = strdup(input_str);
218
    char *host_str = str;
219
    char *src_str;
220
    const char *src_str2;
221
    char *ptr;
222

    
223
    /*
224
     * Chop off any extra arguments at the end of the string which
225
     * would start with a comma, then fill in the src port information
226
     * if it was provided else use the "any address" and "any port".
227
     */
228
    if ((ptr = strchr(str,',')))
229
        *ptr = '\0';
230

    
231
    if ((src_str = strchr(input_str,'@'))) {
232
        *src_str = '\0';
233
        src_str++;
234
    }
235

    
236
    if (parse_host_port(haddr, host_str) < 0)
237
        goto fail;
238

    
239
    src_str2 = src_str;
240
    if (!src_str || *src_str == '\0')
241
        src_str2 = ":0";
242

    
243
    if (parse_host_port(saddr, src_str2) < 0)
244
        goto fail;
245

    
246
    free(str);
247
    return(0);
248

    
249
fail:
250
    free(str);
251
    return -1;
252
}
253

    
254
int parse_host_port(struct sockaddr_in *saddr, const char *str)
255
{
256
    char buf[512];
257
    struct hostent *he;
258
    const char *p, *r;
259
    int port;
260

    
261
    p = str;
262
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0)
263
        return -1;
264
    saddr->sin_family = AF_INET;
265
    if (buf[0] == '\0') {
266
        saddr->sin_addr.s_addr = 0;
267
    } else {
268
        if (qemu_isdigit(buf[0])) {
269
            if (!inet_aton(buf, &saddr->sin_addr))
270
                return -1;
271
        } else {
272
            if ((he = gethostbyname(buf)) == NULL)
273
                return - 1;
274
            saddr->sin_addr = *(struct in_addr *)he->h_addr;
275
        }
276
    }
277
    port = strtol(p, (char **)&r, 0);
278
    if (r == p)
279
        return -1;
280
    saddr->sin_port = htons(port);
281
    return 0;
282
}
283

    
284
#if !defined(_WIN32) && 0
285
static int parse_unix_path(struct sockaddr_un *uaddr, const char *str)
286
{
287
    const char *p;
288
    int len;
289

    
290
    len = MIN(108, strlen(str));
291
    p = strchr(str, ',');
292
    if (p)
293
        len = MIN(len, p - str);
294

    
295
    memset(uaddr, 0, sizeof(*uaddr));
296

    
297
    uaddr->sun_family = AF_UNIX;
298
    memcpy(uaddr->sun_path, str, len);
299

    
300
    return 0;
301
}
302
#endif
303

    
304
void qemu_format_nic_info_str(VLANClientState *vc, uint8_t macaddr[6])
305
{
306
    snprintf(vc->info_str, sizeof(vc->info_str),
307
             "model=%s,macaddr=%02x:%02x:%02x:%02x:%02x:%02x",
308
             vc->model,
309
             macaddr[0], macaddr[1], macaddr[2],
310
             macaddr[3], macaddr[4], macaddr[5]);
311
}
312

    
313
static char *assign_name(VLANClientState *vc1, const char *model)
314
{
315
    VLANState *vlan;
316
    char buf[256];
317
    int id = 0;
318

    
319
    for (vlan = first_vlan; vlan; vlan = vlan->next) {
320
        VLANClientState *vc;
321

    
322
        for (vc = vlan->first_client; vc; vc = vc->next)
323
            if (vc != vc1 && strcmp(vc->model, model) == 0)
324
                id++;
325
    }
326

    
327
    snprintf(buf, sizeof(buf), "%s.%d", model, id);
328

    
329
    return strdup(buf);
330
}
331

    
332
VLANClientState *qemu_new_vlan_client(VLANState *vlan,
333
                                      const char *model,
334
                                      const char *name,
335
                                      NetCanReceive *can_receive,
336
                                      NetReceive *receive,
337
                                      NetReceiveIOV *receive_iov,
338
                                      NetCleanup *cleanup,
339
                                      void *opaque)
340
{
341
    VLANClientState *vc, **pvc;
342
    vc = qemu_mallocz(sizeof(VLANClientState));
343
    vc->model = strdup(model);
344
    if (name)
345
        vc->name = strdup(name);
346
    else
347
        vc->name = assign_name(vc, model);
348
    vc->can_receive = can_receive;
349
    vc->receive = receive;
350
    vc->receive_iov = receive_iov;
351
    vc->cleanup = cleanup;
352
    vc->opaque = opaque;
353
    vc->vlan = vlan;
354

    
355
    vc->next = NULL;
356
    pvc = &vlan->first_client;
357
    while (*pvc != NULL)
358
        pvc = &(*pvc)->next;
359
    *pvc = vc;
360
    return vc;
361
}
362

    
363
void qemu_del_vlan_client(VLANClientState *vc)
364
{
365
    VLANClientState **pvc = &vc->vlan->first_client;
366

    
367
    while (*pvc != NULL)
368
        if (*pvc == vc) {
369
            *pvc = vc->next;
370
            if (vc->cleanup) {
371
                vc->cleanup(vc);
372
            }
373
            free(vc->name);
374
            free(vc->model);
375
            qemu_free(vc);
376
            break;
377
        } else
378
            pvc = &(*pvc)->next;
379
}
380

    
381
VLANClientState *qemu_find_vlan_client(VLANState *vlan, void *opaque)
382
{
383
    VLANClientState **pvc = &vlan->first_client;
384

    
385
    while (*pvc != NULL)
386
        if ((*pvc)->opaque == opaque)
387
            return *pvc;
388
        else
389
            pvc = &(*pvc)->next;
390

    
391
    return NULL;
392
}
393

    
394
int qemu_can_send_packet(VLANClientState *sender)
395
{
396
    VLANState *vlan = sender->vlan;
397
    VLANClientState *vc;
398

    
399
    for (vc = vlan->first_client; vc != NULL; vc = vc->next) {
400
        if (vc == sender) {
401
            continue;
402
        }
403

    
404
        /* no can_receive() handler, they can always receive */
405
        if (!vc->can_receive || vc->can_receive(vc)) {
406
            return 1;
407
        }
408
    }
409
    return 0;
410
}
411

    
412
static int
413
qemu_deliver_packet(VLANClientState *sender, const uint8_t *buf, int size)
414
{
415
    VLANClientState *vc;
416
    int ret = -1;
417

    
418
    sender->vlan->delivering = 1;
419

    
420
    for (vc = sender->vlan->first_client; vc != NULL; vc = vc->next) {
421
        ssize_t len;
422

    
423
        if (vc == sender) {
424
            continue;
425
        }
426

    
427
        if (vc->link_down) {
428
            ret = size;
429
            continue;
430
        }
431

    
432
        len = vc->receive(vc, buf, size);
433

    
434
        ret = (ret >= 0) ? ret : len;
435
    }
436

    
437
    sender->vlan->delivering = 0;
438

    
439
    return ret;
440
}
441

    
442
void qemu_purge_queued_packets(VLANClientState *vc)
443
{
444
    VLANPacket **pp = &vc->vlan->send_queue;
445

    
446
    while (*pp != NULL) {
447
        VLANPacket *packet = *pp;
448

    
449
        if (packet->sender == vc) {
450
            *pp = packet->next;
451
            qemu_free(packet);
452
        } else {
453
            pp = &packet->next;
454
        }
455
    }
456
}
457

    
458
void qemu_flush_queued_packets(VLANClientState *vc)
459
{
460
    VLANPacket *packet;
461

    
462
    while ((packet = vc->vlan->send_queue) != NULL) {
463
        int ret;
464

    
465
        vc->vlan->send_queue = packet->next;
466

    
467
        ret = qemu_deliver_packet(packet->sender, packet->data, packet->size);
468
        if (ret == 0 && packet->sent_cb != NULL) {
469
            packet->next = vc->vlan->send_queue;
470
            vc->vlan->send_queue = packet;
471
            break;
472
        }
473

    
474
        if (packet->sent_cb)
475
            packet->sent_cb(packet->sender, ret);
476

    
477
        qemu_free(packet);
478
    }
479
}
480

    
481
static void qemu_enqueue_packet(VLANClientState *sender,
482
                                const uint8_t *buf, int size,
483
                                NetPacketSent *sent_cb)
484
{
485
    VLANPacket *packet;
486

    
487
    packet = qemu_malloc(sizeof(VLANPacket) + size);
488
    packet->next = sender->vlan->send_queue;
489
    packet->sender = sender;
490
    packet->size = size;
491
    packet->sent_cb = sent_cb;
492
    memcpy(packet->data, buf, size);
493
    sender->vlan->send_queue = packet;
494
}
495

    
496
ssize_t qemu_send_packet_async(VLANClientState *sender,
497
                               const uint8_t *buf, int size,
498
                               NetPacketSent *sent_cb)
499
{
500
    int ret;
501

    
502
    if (sender->link_down) {
503
        return size;
504
    }
505

    
506
#ifdef DEBUG_NET
507
    printf("vlan %d send:\n", sender->vlan->id);
508
    hex_dump(stdout, buf, size);
509
#endif
510

    
511
    if (sender->vlan->delivering) {
512
        qemu_enqueue_packet(sender, buf, size, NULL);
513
        return size;
514
    }
515

    
516
    ret = qemu_deliver_packet(sender, buf, size);
517
    if (ret == 0 && sent_cb != NULL) {
518
        qemu_enqueue_packet(sender, buf, size, sent_cb);
519
        return 0;
520
    }
521

    
522
    qemu_flush_queued_packets(sender);
523

    
524
    return ret;
525
}
526

    
527
void qemu_send_packet(VLANClientState *vc, const uint8_t *buf, int size)
528
{
529
    qemu_send_packet_async(vc, buf, size, NULL);
530
}
531

    
532
static ssize_t vc_sendv_compat(VLANClientState *vc, const struct iovec *iov,
533
                               int iovcnt)
534
{
535
    uint8_t buffer[4096];
536
    size_t offset = 0;
537
    int i;
538

    
539
    for (i = 0; i < iovcnt; i++) {
540
        size_t len;
541

    
542
        len = MIN(sizeof(buffer) - offset, iov[i].iov_len);
543
        memcpy(buffer + offset, iov[i].iov_base, len);
544
        offset += len;
545
    }
546

    
547
    return vc->receive(vc, buffer, offset);
548
}
549

    
550
static ssize_t calc_iov_length(const struct iovec *iov, int iovcnt)
551
{
552
    size_t offset = 0;
553
    int i;
554

    
555
    for (i = 0; i < iovcnt; i++)
556
        offset += iov[i].iov_len;
557
    return offset;
558
}
559

    
560
static int qemu_deliver_packet_iov(VLANClientState *sender,
561
                                   const struct iovec *iov, int iovcnt)
562
{
563
    VLANClientState *vc;
564
    int ret = -1;
565

    
566
    sender->vlan->delivering = 1;
567

    
568
    for (vc = sender->vlan->first_client; vc != NULL; vc = vc->next) {
569
        ssize_t len;
570

    
571
        if (vc == sender) {
572
            continue;
573
        }
574

    
575
        if (vc->link_down) {
576
            ret = calc_iov_length(iov, iovcnt);
577
            continue;
578
        }
579

    
580
        if (vc->receive_iov) {
581
            len = vc->receive_iov(vc, iov, iovcnt);
582
        } else {
583
            len = vc_sendv_compat(vc, iov, iovcnt);
584
        }
585

    
586
        ret = (ret >= 0) ? ret : len;
587
    }
588

    
589
    sender->vlan->delivering = 0;
590

    
591
    return ret;
592
}
593

    
594
static ssize_t qemu_enqueue_packet_iov(VLANClientState *sender,
595
                                       const struct iovec *iov, int iovcnt,
596
                                       NetPacketSent *sent_cb)
597
{
598
    VLANPacket *packet;
599
    size_t max_len = 0;
600
    int i;
601

    
602
    max_len = calc_iov_length(iov, iovcnt);
603

    
604
    packet = qemu_malloc(sizeof(VLANPacket) + max_len);
605
    packet->next = sender->vlan->send_queue;
606
    packet->sender = sender;
607
    packet->sent_cb = sent_cb;
608
    packet->size = 0;
609

    
610
    for (i = 0; i < iovcnt; i++) {
611
        size_t len = iov[i].iov_len;
612

    
613
        memcpy(packet->data + packet->size, iov[i].iov_base, len);
614
        packet->size += len;
615
    }
616

    
617
    sender->vlan->send_queue = packet;
618

    
619
    return packet->size;
620
}
621

    
622
ssize_t qemu_sendv_packet_async(VLANClientState *sender,
623
                                const struct iovec *iov, int iovcnt,
624
                                NetPacketSent *sent_cb)
625
{
626
    int ret;
627

    
628
    if (sender->link_down) {
629
        return calc_iov_length(iov, iovcnt);
630
    }
631

    
632
    if (sender->vlan->delivering) {
633
        return qemu_enqueue_packet_iov(sender, iov, iovcnt, NULL);
634
    }
635

    
636
    ret = qemu_deliver_packet_iov(sender, iov, iovcnt);
637
    if (ret == 0 && sent_cb != NULL) {
638
        qemu_enqueue_packet_iov(sender, iov, iovcnt, sent_cb);
639
        return 0;
640
    }
641

    
642
    qemu_flush_queued_packets(sender);
643

    
644
    return ret;
645
}
646

    
647
ssize_t
648
qemu_sendv_packet(VLANClientState *vc, const struct iovec *iov, int iovcnt)
649
{
650
    return qemu_sendv_packet_async(vc, iov, iovcnt, NULL);
651
}
652

    
653
static void config_error(Monitor *mon, const char *fmt, ...)
654
{
655
    va_list ap;
656

    
657
    va_start(ap, fmt);
658
    if (mon) {
659
        monitor_vprintf(mon, fmt, ap);
660
    } else {
661
        fprintf(stderr, "qemu: ");
662
        vfprintf(stderr, fmt, ap);
663
        exit(1);
664
    }
665
    va_end(ap);
666
}
667

    
668
#if defined(CONFIG_SLIRP)
669

    
670
/* slirp network adapter */
671

    
672
#define SLIRP_CFG_HOSTFWD 1
673
#define SLIRP_CFG_LEGACY  2
674

    
675
struct slirp_config_str {
676
    struct slirp_config_str *next;
677
    int flags;
678
    char str[1024];
679
    int legacy_format;
680
};
681

    
682
static int slirp_inited;
683
static struct slirp_config_str *slirp_configs;
684
const char *legacy_tftp_prefix;
685
const char *legacy_bootp_filename;
686
static VLANClientState *slirp_vc;
687

    
688
static void slirp_hostfwd(Monitor *mon, const char *redir_str,
689
                          int legacy_format);
690
static void slirp_guestfwd(Monitor *mon, const char *config_str,
691
                           int legacy_format);
692

    
693
#ifndef _WIN32
694
static const char *legacy_smb_export;
695

    
696
static void slirp_smb(const char *exported_dir, struct in_addr vserver_addr);
697
#endif
698

    
699
int slirp_can_output(void)
700
{
701
    return !slirp_vc || qemu_can_send_packet(slirp_vc);
702
}
703

    
704
void slirp_output(const uint8_t *pkt, int pkt_len)
705
{
706
#ifdef DEBUG_SLIRP
707
    printf("slirp output:\n");
708
    hex_dump(stdout, pkt, pkt_len);
709
#endif
710
    if (!slirp_vc)
711
        return;
712
    qemu_send_packet(slirp_vc, pkt, pkt_len);
713
}
714

    
715
int slirp_is_inited(void)
716
{
717
    return slirp_inited;
718
}
719

    
720
static ssize_t slirp_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
721
{
722
#ifdef DEBUG_SLIRP
723
    printf("slirp input:\n");
724
    hex_dump(stdout, buf, size);
725
#endif
726
    slirp_input(buf, size);
727
    return size;
728
}
729

    
730
static int slirp_in_use;
731

    
732
static void net_slirp_cleanup(VLANClientState *vc)
733
{
734
    slirp_in_use = 0;
735
}
736

    
737
static int net_slirp_init(Monitor *mon, VLANState *vlan, const char *model,
738
                          const char *name, int restricted,
739
                          const char *vnetwork, const char *vhost,
740
                          const char *vhostname, const char *tftp_export,
741
                          const char *bootfile, const char *vdhcp_start,
742
                          const char *vnameserver, const char *smb_export,
743
                          const char *vsmbserver)
744
{
745
    if (slirp_in_use) {
746
        /* slirp only supports a single instance so far */
747
        return -1;
748
    }
749
    if (!slirp_inited) {
750
        /* default settings according to historic slirp */
751
        struct in_addr net  = { .s_addr = htonl(0x0a000000) }; /* 10.0.0.0 */
752
        struct in_addr mask = { .s_addr = htonl(0xff000000) }; /* 255.0.0.0 */
753
        struct in_addr host = { .s_addr = htonl(0x0a000202) }; /* 10.0.2.2 */
754
        struct in_addr dhcp = { .s_addr = htonl(0x0a00020f) }; /* 10.0.2.15 */
755
        struct in_addr dns  = { .s_addr = htonl(0x0a000203) }; /* 10.0.2.3 */
756
#ifndef _WIN32
757
        struct in_addr smbsrv = { .s_addr = 0 };
758
#endif
759
        char buf[20];
760
        uint32_t addr;
761
        int shift;
762
        char *end;
763

    
764
        if (!tftp_export) {
765
            tftp_export = legacy_tftp_prefix;
766
        }
767
        if (!bootfile) {
768
            bootfile = legacy_bootp_filename;
769
        }
770

    
771
        if (vnetwork) {
772
            if (get_str_sep(buf, sizeof(buf), &vnetwork, '/') < 0) {
773
                if (!inet_aton(vnetwork, &net)) {
774
                    return -1;
775
                }
776
                addr = ntohl(net.s_addr);
777
                if (!(addr & 0x80000000)) {
778
                    mask.s_addr = htonl(0xff000000); /* class A */
779
                } else if ((addr & 0xfff00000) == 0xac100000) {
780
                    mask.s_addr = htonl(0xfff00000); /* priv. 172.16.0.0/12 */
781
                } else if ((addr & 0xc0000000) == 0x80000000) {
782
                    mask.s_addr = htonl(0xffff0000); /* class B */
783
                } else if ((addr & 0xffff0000) == 0xc0a80000) {
784
                    mask.s_addr = htonl(0xffff0000); /* priv. 192.168.0.0/16 */
785
                } else if ((addr & 0xffff0000) == 0xc6120000) {
786
                    mask.s_addr = htonl(0xfffe0000); /* tests 198.18.0.0/15 */
787
                } else if ((addr & 0xe0000000) == 0xe0000000) {
788
                    mask.s_addr = htonl(0xffffff00); /* class C */
789
                } else {
790
                    mask.s_addr = htonl(0xfffffff0); /* multicast/reserved */
791
                }
792
            } else {
793
                if (!inet_aton(buf, &net)) {
794
                    return -1;
795
                }
796
                shift = strtol(vnetwork, &end, 10);
797
                if (*end != '\0') {
798
                    if (!inet_aton(vnetwork, &mask)) {
799
                        return -1;
800
                    }
801
                } else if (shift < 4 || shift > 32) {
802
                    return -1;
803
                } else {
804
                    mask.s_addr = htonl(0xffffffff << (32 - shift));
805
                }
806
            }
807
            net.s_addr &= mask.s_addr;
808
            host.s_addr = net.s_addr | (htonl(0x0202) & ~mask.s_addr);
809
            dhcp.s_addr = net.s_addr | (htonl(0x020f) & ~mask.s_addr);
810
            dns.s_addr  = net.s_addr | (htonl(0x0203) & ~mask.s_addr);
811
        }
812

    
813
        if (vhost && !inet_aton(vhost, &host)) {
814
            return -1;
815
        }
816
        if ((host.s_addr & mask.s_addr) != net.s_addr) {
817
            return -1;
818
        }
819

    
820
        if (vdhcp_start && !inet_aton(vdhcp_start, &dhcp)) {
821
            return -1;
822
        }
823
        if ((dhcp.s_addr & mask.s_addr) != net.s_addr ||
824
            dhcp.s_addr == host.s_addr || dhcp.s_addr == dns.s_addr) {
825
            return -1;
826
        }
827

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

    
836
#ifndef _WIN32
837
        if (vsmbserver && !inet_aton(vsmbserver, &smbsrv)) {
838
            return -1;
839
        }
840
#endif
841

    
842
        slirp_init(restricted, net, mask, host, vhostname, tftp_export,
843
                   bootfile, dhcp, dns);
844
        slirp_inited = 1;
845

    
846
        while (slirp_configs) {
847
            struct slirp_config_str *config = slirp_configs;
848

    
849
            if (config->flags & SLIRP_CFG_HOSTFWD) {
850
                slirp_hostfwd(mon, config->str,
851
                              config->flags & SLIRP_CFG_LEGACY);
852
            } else {
853
                slirp_guestfwd(mon, config->str,
854
                               config->flags & SLIRP_CFG_LEGACY);
855
            }
856
            slirp_configs = config->next;
857
            qemu_free(config);
858
        }
859
#ifndef _WIN32
860
        if (!smb_export) {
861
            smb_export = legacy_smb_export;
862
        }
863
        if (smb_export) {
864
            slirp_smb(smb_export, smbsrv);
865
        }
866
#endif
867
    }
868

    
869
    slirp_vc = qemu_new_vlan_client(vlan, model, name, NULL, slirp_receive,
870
                                    NULL, net_slirp_cleanup, NULL);
871
    slirp_vc->info_str[0] = '\0';
872
    slirp_in_use = 1;
873
    return 0;
874
}
875

    
876
void net_slirp_hostfwd_remove(Monitor *mon, const char *src_str)
877
{
878
    struct in_addr host_addr = { .s_addr = INADDR_ANY };
879
    int host_port;
880
    char buf[256] = "";
881
    const char *p = src_str;
882
    int is_udp = 0;
883
    int err;
884

    
885
    if (!slirp_inited) {
886
        monitor_printf(mon, "user mode network stack not in use\n");
887
        return;
888
    }
889

    
890
    if (!src_str || !src_str[0])
891
        goto fail_syntax;
892

    
893
    get_str_sep(buf, sizeof(buf), &p, ':');
894

    
895
    if (!strcmp(buf, "tcp") || buf[0] == '\0') {
896
        is_udp = 0;
897
    } else if (!strcmp(buf, "udp")) {
898
        is_udp = 1;
899
    } else {
900
        goto fail_syntax;
901
    }
902

    
903
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
904
        goto fail_syntax;
905
    }
906
    if (buf[0] != '\0' && !inet_aton(buf, &host_addr)) {
907
        goto fail_syntax;
908
    }
909

    
910
    host_port = atoi(p);
911

    
912
    err = slirp_remove_hostfwd(is_udp, host_addr, host_port);
913

    
914
    monitor_printf(mon, "host forwarding rule for %s %s\n", src_str,
915
                   err ? "removed" : "not found");
916
    return;
917

    
918
 fail_syntax:
919
    monitor_printf(mon, "invalid format\n");
920
}
921

    
922
static void slirp_hostfwd(Monitor *mon, const char *redir_str,
923
                          int legacy_format)
924
{
925
    struct in_addr host_addr = { .s_addr = INADDR_ANY };
926
    struct in_addr guest_addr = { .s_addr = 0 };
927
    int host_port, guest_port;
928
    const char *p;
929
    char buf[256];
930
    int is_udp;
931
    char *end;
932

    
933
    p = redir_str;
934
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
935
        goto fail_syntax;
936
    }
937
    if (!strcmp(buf, "tcp") || buf[0] == '\0') {
938
        is_udp = 0;
939
    } else if (!strcmp(buf, "udp")) {
940
        is_udp = 1;
941
    } else {
942
        goto fail_syntax;
943
    }
944

    
945
    if (!legacy_format) {
946
        if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
947
            goto fail_syntax;
948
        }
949
        if (buf[0] != '\0' && !inet_aton(buf, &host_addr)) {
950
            goto fail_syntax;
951
        }
952
    }
953

    
954
    if (get_str_sep(buf, sizeof(buf), &p, legacy_format ? ':' : '-') < 0) {
955
        goto fail_syntax;
956
    }
957
    host_port = strtol(buf, &end, 0);
958
    if (*end != '\0' || host_port < 1 || host_port > 65535) {
959
        goto fail_syntax;
960
    }
961

    
962
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
963
        goto fail_syntax;
964
    }
965
    if (buf[0] != '\0' && !inet_aton(buf, &guest_addr)) {
966
        goto fail_syntax;
967
    }
968

    
969
    guest_port = strtol(p, &end, 0);
970
    if (*end != '\0' || guest_port < 1 || guest_port > 65535) {
971
        goto fail_syntax;
972
    }
973

    
974
    if (slirp_add_hostfwd(is_udp, host_addr, host_port,
975
                          guest_addr, guest_port) < 0) {
976
        config_error(mon, "could not set up host forwarding rule '%s'\n",
977
                     redir_str);
978
    }
979
    return;
980

    
981
 fail_syntax:
982
    config_error(mon, "invalid host forwarding rule '%s'\n", redir_str);
983
}
984

    
985
void net_slirp_hostfwd_add(Monitor *mon, const char *redir_str)
986
{
987
    if (!slirp_inited) {
988
        monitor_printf(mon, "user mode network stack not in use\n");
989
        return;
990
    }
991

    
992
    slirp_hostfwd(mon, redir_str, 0);
993
}
994

    
995
void net_slirp_redir(const char *redir_str)
996
{
997
    struct slirp_config_str *config;
998

    
999
    if (!slirp_inited) {
1000
        config = qemu_malloc(sizeof(*config));
1001
        pstrcpy(config->str, sizeof(config->str), redir_str);
1002
        config->flags = SLIRP_CFG_HOSTFWD | SLIRP_CFG_LEGACY;
1003
        config->next = slirp_configs;
1004
        slirp_configs = config;
1005
        return;
1006
    }
1007

    
1008
    slirp_hostfwd(NULL, redir_str, 1);
1009
}
1010

    
1011
#ifndef _WIN32
1012

    
1013
static char smb_dir[1024];
1014

    
1015
static void erase_dir(char *dir_name)
1016
{
1017
    DIR *d;
1018
    struct dirent *de;
1019
    char filename[1024];
1020

    
1021
    /* erase all the files in the directory */
1022
    if ((d = opendir(dir_name)) != NULL) {
1023
        for(;;) {
1024
            de = readdir(d);
1025
            if (!de)
1026
                break;
1027
            if (strcmp(de->d_name, ".") != 0 &&
1028
                strcmp(de->d_name, "..") != 0) {
1029
                snprintf(filename, sizeof(filename), "%s/%s",
1030
                         smb_dir, de->d_name);
1031
                if (unlink(filename) != 0)  /* is it a directory? */
1032
                    erase_dir(filename);
1033
            }
1034
        }
1035
        closedir(d);
1036
        rmdir(dir_name);
1037
    }
1038
}
1039

    
1040
/* automatic user mode samba server configuration */
1041
static void smb_exit(void)
1042
{
1043
    erase_dir(smb_dir);
1044
}
1045

    
1046
static void slirp_smb(const char *exported_dir, struct in_addr vserver_addr)
1047
{
1048
    char smb_conf[1024];
1049
    char smb_cmdline[1024];
1050
    FILE *f;
1051

    
1052
    /* XXX: better tmp dir construction */
1053
    snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%ld", (long)getpid());
1054
    if (mkdir(smb_dir, 0700) < 0) {
1055
        fprintf(stderr, "qemu: could not create samba server dir '%s'\n", smb_dir);
1056
        exit(1);
1057
    }
1058
    snprintf(smb_conf, sizeof(smb_conf), "%s/%s", smb_dir, "smb.conf");
1059

    
1060
    f = fopen(smb_conf, "w");
1061
    if (!f) {
1062
        fprintf(stderr, "qemu: could not create samba server configuration file '%s'\n", smb_conf);
1063
        exit(1);
1064
    }
1065
    fprintf(f,
1066
            "[global]\n"
1067
            "private dir=%s\n"
1068
            "smb ports=0\n"
1069
            "socket address=127.0.0.1\n"
1070
            "pid directory=%s\n"
1071
            "lock directory=%s\n"
1072
            "log file=%s/log.smbd\n"
1073
            "smb passwd file=%s/smbpasswd\n"
1074
            "security = share\n"
1075
            "[qemu]\n"
1076
            "path=%s\n"
1077
            "read only=no\n"
1078
            "guest ok=yes\n",
1079
            smb_dir,
1080
            smb_dir,
1081
            smb_dir,
1082
            smb_dir,
1083
            smb_dir,
1084
            exported_dir
1085
            );
1086
    fclose(f);
1087
    atexit(smb_exit);
1088

    
1089
    snprintf(smb_cmdline, sizeof(smb_cmdline), "%s -s %s",
1090
             SMBD_COMMAND, smb_conf);
1091

    
1092
    if (slirp_add_exec(0, smb_cmdline, vserver_addr, 139) < 0) {
1093
        fprintf(stderr, "conflicting/invalid smbserver address\n");
1094
        exit(1);
1095
    }
1096
}
1097

    
1098
/* automatic user mode samba server configuration (legacy interface) */
1099
void net_slirp_smb(const char *exported_dir)
1100
{
1101
    struct in_addr vserver_addr = { .s_addr = 0 };
1102

    
1103
    if (legacy_smb_export) {
1104
        fprintf(stderr, "-smb given twice\n");
1105
        exit(1);
1106
    }
1107
    legacy_smb_export = exported_dir;
1108
    if (slirp_inited) {
1109
        slirp_smb(exported_dir, vserver_addr);
1110
    }
1111
}
1112

    
1113
#endif /* !defined(_WIN32) */
1114

    
1115
void do_info_slirp(Monitor *mon)
1116
{
1117
    slirp_stats();
1118
}
1119

    
1120
struct GuestFwd {
1121
    CharDriverState *hd;
1122
    struct in_addr server;
1123
    int port;
1124
};
1125

    
1126
static int guestfwd_can_read(void *opaque)
1127
{
1128
    struct GuestFwd *fwd = opaque;
1129
    return slirp_socket_can_recv(fwd->server, fwd->port);
1130
}
1131

    
1132
static void guestfwd_read(void *opaque, const uint8_t *buf, int size)
1133
{
1134
    struct GuestFwd *fwd = opaque;
1135
    slirp_socket_recv(fwd->server, fwd->port, buf, size);
1136
}
1137

    
1138
static void slirp_guestfwd(Monitor *mon, const char *config_str,
1139
                           int legacy_format)
1140
{
1141
    struct in_addr server = { .s_addr = 0 };
1142
    struct GuestFwd *fwd;
1143
    const char *p;
1144
    char buf[128];
1145
    char *end;
1146
    int port;
1147

    
1148
    p = config_str;
1149
    if (legacy_format) {
1150
        if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1151
            goto fail_syntax;
1152
        }
1153
    } else {
1154
        if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1155
            goto fail_syntax;
1156
        }
1157
        if (strcmp(buf, "tcp") && buf[0] != '\0') {
1158
            goto fail_syntax;
1159
        }
1160
        if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
1161
            goto fail_syntax;
1162
        }
1163
        if (buf[0] != '\0' && !inet_aton(buf, &server)) {
1164
            goto fail_syntax;
1165
        }
1166
        if (get_str_sep(buf, sizeof(buf), &p, '-') < 0) {
1167
            goto fail_syntax;
1168
        }
1169
    }
1170
    port = strtol(buf, &end, 10);
1171
    if (*end != '\0' || port < 1 || port > 65535) {
1172
        goto fail_syntax;
1173
    }
1174

    
1175
    fwd = qemu_malloc(sizeof(struct GuestFwd));
1176
    snprintf(buf, sizeof(buf), "guestfwd.tcp:%d", port);
1177
    fwd->hd = qemu_chr_open(buf, p, NULL);
1178
    if (!fwd->hd) {
1179
        config_error(mon, "could not open guest forwarding device '%s'\n",
1180
                     buf);
1181
        qemu_free(fwd);
1182
        return;
1183
    }
1184
    fwd->server = server;
1185
    fwd->port = port;
1186

    
1187
    if (slirp_add_exec(3, fwd->hd, server, port) < 0) {
1188
        config_error(mon, "conflicting/invalid host:port in guest forwarding "
1189
                     "rule '%s'\n", config_str);
1190
        qemu_free(fwd);
1191
        return;
1192
    }
1193
    qemu_chr_add_handlers(fwd->hd, guestfwd_can_read, guestfwd_read,
1194
                          NULL, fwd);
1195
    return;
1196

    
1197
 fail_syntax:
1198
    config_error(mon, "invalid guest forwarding rule '%s'\n", config_str);
1199
}
1200

    
1201
void do_info_usernet(Monitor *mon)
1202
{
1203
    monitor_printf(mon, "VLAN %d (%s):\n", slirp_vc->vlan->id, slirp_vc->name);
1204
    slirp_connection_info(mon);
1205
}
1206

    
1207
#endif /* CONFIG_SLIRP */
1208

    
1209
#if !defined(_WIN32)
1210

    
1211
typedef struct TAPState {
1212
    VLANClientState *vc;
1213
    int fd;
1214
    char down_script[1024];
1215
    char down_script_arg[128];
1216
    uint8_t buf[4096];
1217
    unsigned int read_poll : 1;
1218
    unsigned int write_poll : 1;
1219
} TAPState;
1220

    
1221
static int launch_script(const char *setup_script, const char *ifname, int fd);
1222

    
1223
static int tap_can_send(void *opaque);
1224
static void tap_send(void *opaque);
1225
static void tap_writable(void *opaque);
1226

    
1227
static void tap_update_fd_handler(TAPState *s)
1228
{
1229
    qemu_set_fd_handler2(s->fd,
1230
                         s->read_poll  ? tap_can_send : NULL,
1231
                         s->read_poll  ? tap_send     : NULL,
1232
                         s->write_poll ? tap_writable : NULL,
1233
                         s);
1234
}
1235

    
1236
static void tap_read_poll(TAPState *s, int enable)
1237
{
1238
    s->read_poll = !!enable;
1239
    tap_update_fd_handler(s);
1240
}
1241

    
1242
static void tap_write_poll(TAPState *s, int enable)
1243
{
1244
    s->write_poll = !!enable;
1245
    tap_update_fd_handler(s);
1246
}
1247

    
1248
static void tap_writable(void *opaque)
1249
{
1250
    TAPState *s = opaque;
1251

    
1252
    tap_write_poll(s, 0);
1253

    
1254
    qemu_flush_queued_packets(s->vc);
1255
}
1256

    
1257
static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov,
1258
                               int iovcnt)
1259
{
1260
    TAPState *s = vc->opaque;
1261
    ssize_t len;
1262

    
1263
    do {
1264
        len = writev(s->fd, iov, iovcnt);
1265
    } while (len == -1 && errno == EINTR);
1266

    
1267
    if (len == -1 && errno == EAGAIN) {
1268
        tap_write_poll(s, 1);
1269
        return 0;
1270
    }
1271

    
1272
    return len;
1273
}
1274

    
1275
static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1276
{
1277
    TAPState *s = vc->opaque;
1278
    ssize_t len;
1279

    
1280
    do {
1281
        len = write(s->fd, buf, size);
1282
    } while (len == -1 && (errno == EINTR || errno == EAGAIN));
1283

    
1284
    return len;
1285
}
1286

    
1287
static int tap_can_send(void *opaque)
1288
{
1289
    TAPState *s = opaque;
1290

    
1291
    return qemu_can_send_packet(s->vc);
1292
}
1293

    
1294
#ifdef __sun__
1295
static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1296
{
1297
    struct strbuf sbuf;
1298
    int f = 0;
1299

    
1300
    sbuf.maxlen = maxlen;
1301
    sbuf.buf = (char *)buf;
1302

    
1303
    return getmsg(tapfd, NULL, &sbuf, &f) >= 0 ? sbuf.len : -1;
1304
}
1305
#else
1306
static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1307
{
1308
    return read(tapfd, buf, maxlen);
1309
}
1310
#endif
1311

    
1312
static void tap_send_completed(VLANClientState *vc, ssize_t len)
1313
{
1314
    TAPState *s = vc->opaque;
1315
    tap_read_poll(s, 1);
1316
}
1317

    
1318
static void tap_send(void *opaque)
1319
{
1320
    TAPState *s = opaque;
1321
    int size;
1322

    
1323
    do {
1324
        size = tap_read_packet(s->fd, s->buf, sizeof(s->buf));
1325
        if (size <= 0) {
1326
            break;
1327
        }
1328

    
1329
        size = qemu_send_packet_async(s->vc, s->buf, size, tap_send_completed);
1330
        if (size == 0) {
1331
            tap_read_poll(s, 0);
1332
        }
1333
    } while (size > 0);
1334
}
1335

    
1336
static void tap_set_sndbuf(TAPState *s, int sndbuf, Monitor *mon)
1337
{
1338
#ifdef TUNSETSNDBUF
1339
    if (ioctl(s->fd, TUNSETSNDBUF, &sndbuf) == -1) {
1340
        config_error(mon, "TUNSETSNDBUF ioctl failed: %s\n",
1341
                     strerror(errno));
1342
    }
1343
#else
1344
    config_error(mon, "No '-net tap,sndbuf=<nbytes>' support available\n");
1345
#endif
1346
}
1347

    
1348
static void tap_cleanup(VLANClientState *vc)
1349
{
1350
    TAPState *s = vc->opaque;
1351

    
1352
    qemu_purge_queued_packets(vc);
1353

    
1354
    if (s->down_script[0])
1355
        launch_script(s->down_script, s->down_script_arg, s->fd);
1356

    
1357
    tap_read_poll(s, 0);
1358
    tap_write_poll(s, 0);
1359
    close(s->fd);
1360
    qemu_free(s);
1361
}
1362

    
1363
/* fd support */
1364

    
1365
static TAPState *net_tap_fd_init(VLANState *vlan,
1366
                                 const char *model,
1367
                                 const char *name,
1368
                                 int fd)
1369
{
1370
    TAPState *s;
1371

    
1372
    s = qemu_mallocz(sizeof(TAPState));
1373
    s->fd = fd;
1374
    s->vc = qemu_new_vlan_client(vlan, model, name, NULL, tap_receive,
1375
                                 tap_receive_iov, tap_cleanup, s);
1376
    tap_read_poll(s, 1);
1377
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), "fd=%d", fd);
1378
    return s;
1379
}
1380

    
1381
#if defined (HOST_BSD) || defined (__FreeBSD_kernel__)
1382
static int tap_open(char *ifname, int ifname_size)
1383
{
1384
    int fd;
1385
    char *dev;
1386
    struct stat s;
1387

    
1388
    TFR(fd = open("/dev/tap", O_RDWR));
1389
    if (fd < 0) {
1390
        fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
1391
        return -1;
1392
    }
1393

    
1394
    fstat(fd, &s);
1395
    dev = devname(s.st_rdev, S_IFCHR);
1396
    pstrcpy(ifname, ifname_size, dev);
1397

    
1398
    fcntl(fd, F_SETFL, O_NONBLOCK);
1399
    return fd;
1400
}
1401
#elif defined(__sun__)
1402
#define TUNNEWPPA       (('T'<<16) | 0x0001)
1403
/*
1404
 * Allocate TAP device, returns opened fd.
1405
 * Stores dev name in the first arg(must be large enough).
1406
 */
1407
static int tap_alloc(char *dev, size_t dev_size)
1408
{
1409
    int tap_fd, if_fd, ppa = -1;
1410
    static int ip_fd = 0;
1411
    char *ptr;
1412

    
1413
    static int arp_fd = 0;
1414
    int ip_muxid, arp_muxid;
1415
    struct strioctl  strioc_if, strioc_ppa;
1416
    int link_type = I_PLINK;;
1417
    struct lifreq ifr;
1418
    char actual_name[32] = "";
1419

    
1420
    memset(&ifr, 0x0, sizeof(ifr));
1421

    
1422
    if( *dev ){
1423
       ptr = dev;
1424
       while( *ptr && !qemu_isdigit((int)*ptr) ) ptr++;
1425
       ppa = atoi(ptr);
1426
    }
1427

    
1428
    /* Check if IP device was opened */
1429
    if( ip_fd )
1430
       close(ip_fd);
1431

    
1432
    TFR(ip_fd = open("/dev/udp", O_RDWR, 0));
1433
    if (ip_fd < 0) {
1434
       syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)");
1435
       return -1;
1436
    }
1437

    
1438
    TFR(tap_fd = open("/dev/tap", O_RDWR, 0));
1439
    if (tap_fd < 0) {
1440
       syslog(LOG_ERR, "Can't open /dev/tap");
1441
       return -1;
1442
    }
1443

    
1444
    /* Assign a new PPA and get its unit number. */
1445
    strioc_ppa.ic_cmd = TUNNEWPPA;
1446
    strioc_ppa.ic_timout = 0;
1447
    strioc_ppa.ic_len = sizeof(ppa);
1448
    strioc_ppa.ic_dp = (char *)&ppa;
1449
    if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0)
1450
       syslog (LOG_ERR, "Can't assign new interface");
1451

    
1452
    TFR(if_fd = open("/dev/tap", O_RDWR, 0));
1453
    if (if_fd < 0) {
1454
       syslog(LOG_ERR, "Can't open /dev/tap (2)");
1455
       return -1;
1456
    }
1457
    if(ioctl(if_fd, I_PUSH, "ip") < 0){
1458
       syslog(LOG_ERR, "Can't push IP module");
1459
       return -1;
1460
    }
1461

    
1462
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) < 0)
1463
        syslog(LOG_ERR, "Can't get flags\n");
1464

    
1465
    snprintf (actual_name, 32, "tap%d", ppa);
1466
    pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
1467

    
1468
    ifr.lifr_ppa = ppa;
1469
    /* Assign ppa according to the unit number returned by tun device */
1470

    
1471
    if (ioctl (if_fd, SIOCSLIFNAME, &ifr) < 0)
1472
        syslog (LOG_ERR, "Can't set PPA %d", ppa);
1473
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) <0)
1474
        syslog (LOG_ERR, "Can't get flags\n");
1475
    /* Push arp module to if_fd */
1476
    if (ioctl (if_fd, I_PUSH, "arp") < 0)
1477
        syslog (LOG_ERR, "Can't push ARP module (2)");
1478

    
1479
    /* Push arp module to ip_fd */
1480
    if (ioctl (ip_fd, I_POP, NULL) < 0)
1481
        syslog (LOG_ERR, "I_POP failed\n");
1482
    if (ioctl (ip_fd, I_PUSH, "arp") < 0)
1483
        syslog (LOG_ERR, "Can't push ARP module (3)\n");
1484
    /* Open arp_fd */
1485
    TFR(arp_fd = open ("/dev/tap", O_RDWR, 0));
1486
    if (arp_fd < 0)
1487
       syslog (LOG_ERR, "Can't open %s\n", "/dev/tap");
1488

    
1489
    /* Set ifname to arp */
1490
    strioc_if.ic_cmd = SIOCSLIFNAME;
1491
    strioc_if.ic_timout = 0;
1492
    strioc_if.ic_len = sizeof(ifr);
1493
    strioc_if.ic_dp = (char *)&ifr;
1494
    if (ioctl(arp_fd, I_STR, &strioc_if) < 0){
1495
        syslog (LOG_ERR, "Can't set ifname to arp\n");
1496
    }
1497

    
1498
    if((ip_muxid = ioctl(ip_fd, I_LINK, if_fd)) < 0){
1499
       syslog(LOG_ERR, "Can't link TAP device to IP");
1500
       return -1;
1501
    }
1502

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

    
1506
    close (if_fd);
1507

    
1508
    memset(&ifr, 0x0, sizeof(ifr));
1509
    pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
1510
    ifr.lifr_ip_muxid  = ip_muxid;
1511
    ifr.lifr_arp_muxid = arp_muxid;
1512

    
1513
    if (ioctl (ip_fd, SIOCSLIFMUXID, &ifr) < 0)
1514
    {
1515
      ioctl (ip_fd, I_PUNLINK , arp_muxid);
1516
      ioctl (ip_fd, I_PUNLINK, ip_muxid);
1517
      syslog (LOG_ERR, "Can't set multiplexor id");
1518
    }
1519

    
1520
    snprintf(dev, dev_size, "tap%d", ppa);
1521
    return tap_fd;
1522
}
1523

    
1524
static int tap_open(char *ifname, int ifname_size)
1525
{
1526
    char  dev[10]="";
1527
    int fd;
1528
    if( (fd = tap_alloc(dev, sizeof(dev))) < 0 ){
1529
       fprintf(stderr, "Cannot allocate TAP device\n");
1530
       return -1;
1531
    }
1532
    pstrcpy(ifname, ifname_size, dev);
1533
    fcntl(fd, F_SETFL, O_NONBLOCK);
1534
    return fd;
1535
}
1536
#elif defined (_AIX)
1537
static int tap_open(char *ifname, int ifname_size)
1538
{
1539
    fprintf (stderr, "no tap on AIX\n");
1540
    return -1;
1541
}
1542
#else
1543
static int tap_open(char *ifname, int ifname_size)
1544
{
1545
    struct ifreq ifr;
1546
    int fd, ret;
1547

    
1548
    TFR(fd = open("/dev/net/tun", O_RDWR));
1549
    if (fd < 0) {
1550
        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
1551
        return -1;
1552
    }
1553
    memset(&ifr, 0, sizeof(ifr));
1554
    ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
1555
    if (ifname[0] != '\0')
1556
        pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
1557
    else
1558
        pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
1559
    ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
1560
    if (ret != 0) {
1561
        fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
1562
        close(fd);
1563
        return -1;
1564
    }
1565
    pstrcpy(ifname, ifname_size, ifr.ifr_name);
1566
    fcntl(fd, F_SETFL, O_NONBLOCK);
1567
    return fd;
1568
}
1569
#endif
1570

    
1571
static int launch_script(const char *setup_script, const char *ifname, int fd)
1572
{
1573
    sigset_t oldmask, mask;
1574
    int pid, status;
1575
    char *args[3];
1576
    char **parg;
1577

    
1578
    sigemptyset(&mask);
1579
    sigaddset(&mask, SIGCHLD);
1580
    sigprocmask(SIG_BLOCK, &mask, &oldmask);
1581

    
1582
    /* try to launch network script */
1583
    pid = fork();
1584
    if (pid == 0) {
1585
        int open_max = sysconf(_SC_OPEN_MAX), i;
1586

    
1587
        for (i = 0; i < open_max; i++) {
1588
            if (i != STDIN_FILENO &&
1589
                i != STDOUT_FILENO &&
1590
                i != STDERR_FILENO &&
1591
                i != fd) {
1592
                close(i);
1593
            }
1594
        }
1595
        parg = args;
1596
        *parg++ = (char *)setup_script;
1597
        *parg++ = (char *)ifname;
1598
        *parg++ = NULL;
1599
        execv(setup_script, args);
1600
        _exit(1);
1601
    } else if (pid > 0) {
1602
        while (waitpid(pid, &status, 0) != pid) {
1603
            /* loop */
1604
        }
1605
        sigprocmask(SIG_SETMASK, &oldmask, NULL);
1606

    
1607
        if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
1608
            return 0;
1609
        }
1610
    }
1611
    fprintf(stderr, "%s: could not launch network script\n", setup_script);
1612
    return -1;
1613
}
1614

    
1615
static TAPState *net_tap_init(VLANState *vlan, const char *model,
1616
                              const char *name, const char *ifname1,
1617
                              const char *setup_script, const char *down_script)
1618
{
1619
    TAPState *s;
1620
    int fd;
1621
    char ifname[128];
1622

    
1623
    if (ifname1 != NULL)
1624
        pstrcpy(ifname, sizeof(ifname), ifname1);
1625
    else
1626
        ifname[0] = '\0';
1627
    TFR(fd = tap_open(ifname, sizeof(ifname)));
1628
    if (fd < 0)
1629
        return NULL;
1630

    
1631
    if (!setup_script || !strcmp(setup_script, "no"))
1632
        setup_script = "";
1633
    if (setup_script[0] != '\0' &&
1634
        launch_script(setup_script, ifname, fd)) {
1635
        return NULL;
1636
    }
1637
    s = net_tap_fd_init(vlan, model, name, fd);
1638
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1639
             "ifname=%s,script=%s,downscript=%s",
1640
             ifname, setup_script, down_script);
1641
    if (down_script && strcmp(down_script, "no")) {
1642
        snprintf(s->down_script, sizeof(s->down_script), "%s", down_script);
1643
        snprintf(s->down_script_arg, sizeof(s->down_script_arg), "%s", ifname);
1644
    }
1645
    return s;
1646
}
1647

    
1648
#endif /* !_WIN32 */
1649

    
1650
#if defined(CONFIG_VDE)
1651
typedef struct VDEState {
1652
    VLANClientState *vc;
1653
    VDECONN *vde;
1654
} VDEState;
1655

    
1656
static void vde_to_qemu(void *opaque)
1657
{
1658
    VDEState *s = opaque;
1659
    uint8_t buf[4096];
1660
    int size;
1661

    
1662
    size = vde_recv(s->vde, (char *)buf, sizeof(buf), 0);
1663
    if (size > 0) {
1664
        qemu_send_packet(s->vc, buf, size);
1665
    }
1666
}
1667

    
1668
static ssize_t vde_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1669
{
1670
    VDEState *s = vc->opaque;
1671
    ssize_t ret;
1672

    
1673
    do {
1674
      ret = vde_send(s->vde, (const char *)buf, size, 0);
1675
    } while (ret < 0 && errno == EINTR);
1676

    
1677
    return ret;
1678
}
1679

    
1680
static void vde_cleanup(VLANClientState *vc)
1681
{
1682
    VDEState *s = vc->opaque;
1683
    qemu_set_fd_handler(vde_datafd(s->vde), NULL, NULL, NULL);
1684
    vde_close(s->vde);
1685
    qemu_free(s);
1686
}
1687

    
1688
static int net_vde_init(VLANState *vlan, const char *model,
1689
                        const char *name, const char *sock,
1690
                        int port, const char *group, int mode)
1691
{
1692
    VDEState *s;
1693
    char *init_group = strlen(group) ? (char *)group : NULL;
1694
    char *init_sock = strlen(sock) ? (char *)sock : NULL;
1695

    
1696
    struct vde_open_args args = {
1697
        .port = port,
1698
        .group = init_group,
1699
        .mode = mode,
1700
    };
1701

    
1702
    s = qemu_mallocz(sizeof(VDEState));
1703
    s->vde = vde_open(init_sock, (char *)"QEMU", &args);
1704
    if (!s->vde){
1705
        free(s);
1706
        return -1;
1707
    }
1708
    s->vc = qemu_new_vlan_client(vlan, model, name, NULL, vde_receive,
1709
                                 NULL, vde_cleanup, s);
1710
    qemu_set_fd_handler(vde_datafd(s->vde), vde_to_qemu, NULL, s);
1711
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), "sock=%s,fd=%d",
1712
             sock, vde_datafd(s->vde));
1713
    return 0;
1714
}
1715
#endif
1716

    
1717
/* network connection */
1718
typedef struct NetSocketState {
1719
    VLANClientState *vc;
1720
    int fd;
1721
    int state; /* 0 = getting length, 1 = getting data */
1722
    unsigned int index;
1723
    unsigned int packet_len;
1724
    uint8_t buf[4096];
1725
    struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
1726
} NetSocketState;
1727

    
1728
typedef struct NetSocketListenState {
1729
    VLANState *vlan;
1730
    char *model;
1731
    char *name;
1732
    int fd;
1733
} NetSocketListenState;
1734

    
1735
/* XXX: we consider we can send the whole packet without blocking */
1736
static ssize_t net_socket_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1737
{
1738
    NetSocketState *s = vc->opaque;
1739
    uint32_t len;
1740
    len = htonl(size);
1741

    
1742
    send_all(s->fd, (const uint8_t *)&len, sizeof(len));
1743
    return send_all(s->fd, buf, size);
1744
}
1745

    
1746
static ssize_t net_socket_receive_dgram(VLANClientState *vc, const uint8_t *buf, size_t size)
1747
{
1748
    NetSocketState *s = vc->opaque;
1749

    
1750
    return sendto(s->fd, (const void *)buf, size, 0,
1751
                  (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
1752
}
1753

    
1754
static void net_socket_send(void *opaque)
1755
{
1756
    NetSocketState *s = opaque;
1757
    int size, err;
1758
    unsigned l;
1759
    uint8_t buf1[4096];
1760
    const uint8_t *buf;
1761

    
1762
    size = recv(s->fd, (void *)buf1, sizeof(buf1), 0);
1763
    if (size < 0) {
1764
        err = socket_error();
1765
        if (err != EWOULDBLOCK)
1766
            goto eoc;
1767
    } else if (size == 0) {
1768
        /* end of connection */
1769
    eoc:
1770
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1771
        closesocket(s->fd);
1772
        return;
1773
    }
1774
    buf = buf1;
1775
    while (size > 0) {
1776
        /* reassemble a packet from the network */
1777
        switch(s->state) {
1778
        case 0:
1779
            l = 4 - s->index;
1780
            if (l > size)
1781
                l = size;
1782
            memcpy(s->buf + s->index, buf, l);
1783
            buf += l;
1784
            size -= l;
1785
            s->index += l;
1786
            if (s->index == 4) {
1787
                /* got length */
1788
                s->packet_len = ntohl(*(uint32_t *)s->buf);
1789
                s->index = 0;
1790
                s->state = 1;
1791
            }
1792
            break;
1793
        case 1:
1794
            l = s->packet_len - s->index;
1795
            if (l > size)
1796
                l = size;
1797
            if (s->index + l <= sizeof(s->buf)) {
1798
                memcpy(s->buf + s->index, buf, l);
1799
            } else {
1800
                fprintf(stderr, "serious error: oversized packet received,"
1801
                    "connection terminated.\n");
1802
                s->state = 0;
1803
                goto eoc;
1804
            }
1805

    
1806
            s->index += l;
1807
            buf += l;
1808
            size -= l;
1809
            if (s->index >= s->packet_len) {
1810
                qemu_send_packet(s->vc, s->buf, s->packet_len);
1811
                s->index = 0;
1812
                s->state = 0;
1813
            }
1814
            break;
1815
        }
1816
    }
1817
}
1818

    
1819
static void net_socket_send_dgram(void *opaque)
1820
{
1821
    NetSocketState *s = opaque;
1822
    int size;
1823

    
1824
    size = recv(s->fd, (void *)s->buf, sizeof(s->buf), 0);
1825
    if (size < 0)
1826
        return;
1827
    if (size == 0) {
1828
        /* end of connection */
1829
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1830
        return;
1831
    }
1832
    qemu_send_packet(s->vc, s->buf, size);
1833
}
1834

    
1835
static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
1836
{
1837
    struct ip_mreq imr;
1838
    int fd;
1839
    int val, ret;
1840
    if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
1841
        fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
1842
                inet_ntoa(mcastaddr->sin_addr),
1843
                (int)ntohl(mcastaddr->sin_addr.s_addr));
1844
        return -1;
1845

    
1846
    }
1847
    fd = socket(PF_INET, SOCK_DGRAM, 0);
1848
    if (fd < 0) {
1849
        perror("socket(PF_INET, SOCK_DGRAM)");
1850
        return -1;
1851
    }
1852

    
1853
    val = 1;
1854
    ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
1855
                   (const char *)&val, sizeof(val));
1856
    if (ret < 0) {
1857
        perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
1858
        goto fail;
1859
    }
1860

    
1861
    ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
1862
    if (ret < 0) {
1863
        perror("bind");
1864
        goto fail;
1865
    }
1866

    
1867
    /* Add host to multicast group */
1868
    imr.imr_multiaddr = mcastaddr->sin_addr;
1869
    imr.imr_interface.s_addr = htonl(INADDR_ANY);
1870

    
1871
    ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
1872
                     (const char *)&imr, sizeof(struct ip_mreq));
1873
    if (ret < 0) {
1874
        perror("setsockopt(IP_ADD_MEMBERSHIP)");
1875
        goto fail;
1876
    }
1877

    
1878
    /* Force mcast msgs to loopback (eg. several QEMUs in same host */
1879
    val = 1;
1880
    ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
1881
                   (const char *)&val, sizeof(val));
1882
    if (ret < 0) {
1883
        perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
1884
        goto fail;
1885
    }
1886

    
1887
    socket_set_nonblock(fd);
1888
    return fd;
1889
fail:
1890
    if (fd >= 0)
1891
        closesocket(fd);
1892
    return -1;
1893
}
1894

    
1895
static void net_socket_cleanup(VLANClientState *vc)
1896
{
1897
    NetSocketState *s = vc->opaque;
1898
    qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1899
    close(s->fd);
1900
    qemu_free(s);
1901
}
1902

    
1903
static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan,
1904
                                                const char *model,
1905
                                                const char *name,
1906
                                                int fd, int is_connected)
1907
{
1908
    struct sockaddr_in saddr;
1909
    int newfd;
1910
    socklen_t saddr_len;
1911
    NetSocketState *s;
1912

    
1913
    /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
1914
     * Because this may be "shared" socket from a "master" process, datagrams would be recv()
1915
     * by ONLY ONE process: we must "clone" this dgram socket --jjo
1916
     */
1917

    
1918
    if (is_connected) {
1919
        if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
1920
            /* must be bound */
1921
            if (saddr.sin_addr.s_addr==0) {
1922
                fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
1923
                        fd);
1924
                return NULL;
1925
            }
1926
            /* clone dgram socket */
1927
            newfd = net_socket_mcast_create(&saddr);
1928
            if (newfd < 0) {
1929
                /* error already reported by net_socket_mcast_create() */
1930
                close(fd);
1931
                return NULL;
1932
            }
1933
            /* clone newfd to fd, close newfd */
1934
            dup2(newfd, fd);
1935
            close(newfd);
1936

    
1937
        } else {
1938
            fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
1939
                    fd, strerror(errno));
1940
            return NULL;
1941
        }
1942
    }
1943

    
1944
    s = qemu_mallocz(sizeof(NetSocketState));
1945
    s->fd = fd;
1946

    
1947
    s->vc = qemu_new_vlan_client(vlan, model, name, NULL, net_socket_receive_dgram,
1948
                                 NULL, net_socket_cleanup, s);
1949
    qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
1950

    
1951
    /* mcast: save bound address as dst */
1952
    if (is_connected) s->dgram_dst=saddr;
1953

    
1954
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1955
            "socket: fd=%d (%s mcast=%s:%d)",
1956
            fd, is_connected? "cloned" : "",
1957
            inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
1958
    return s;
1959
}
1960

    
1961
static void net_socket_connect(void *opaque)
1962
{
1963
    NetSocketState *s = opaque;
1964
    qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
1965
}
1966

    
1967
static NetSocketState *net_socket_fd_init_stream(VLANState *vlan,
1968
                                                 const char *model,
1969
                                                 const char *name,
1970
                                                 int fd, int is_connected)
1971
{
1972
    NetSocketState *s;
1973
    s = qemu_mallocz(sizeof(NetSocketState));
1974
    s->fd = fd;
1975
    s->vc = qemu_new_vlan_client(vlan, model, name, NULL, net_socket_receive,
1976
                                 NULL, net_socket_cleanup, s);
1977
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1978
             "socket: fd=%d", fd);
1979
    if (is_connected) {
1980
        net_socket_connect(s);
1981
    } else {
1982
        qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
1983
    }
1984
    return s;
1985
}
1986

    
1987
static NetSocketState *net_socket_fd_init(VLANState *vlan,
1988
                                          const char *model, const char *name,
1989
                                          int fd, int is_connected)
1990
{
1991
    int so_type=-1, optlen=sizeof(so_type);
1992

    
1993
    if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type,
1994
        (socklen_t *)&optlen)< 0) {
1995
        fprintf(stderr, "qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n", fd);
1996
        return NULL;
1997
    }
1998
    switch(so_type) {
1999
    case SOCK_DGRAM:
2000
        return net_socket_fd_init_dgram(vlan, model, name, fd, is_connected);
2001
    case SOCK_STREAM:
2002
        return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
2003
    default:
2004
        /* who knows ... this could be a eg. a pty, do warn and continue as stream */
2005
        fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
2006
        return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
2007
    }
2008
    return NULL;
2009
}
2010

    
2011
static void net_socket_accept(void *opaque)
2012
{
2013
    NetSocketListenState *s = opaque;
2014
    NetSocketState *s1;
2015
    struct sockaddr_in saddr;
2016
    socklen_t len;
2017
    int fd;
2018

    
2019
    for(;;) {
2020
        len = sizeof(saddr);
2021
        fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
2022
        if (fd < 0 && errno != EINTR) {
2023
            return;
2024
        } else if (fd >= 0) {
2025
            break;
2026
        }
2027
    }
2028
    s1 = net_socket_fd_init(s->vlan, s->model, s->name, fd, 1);
2029
    if (!s1) {
2030
        closesocket(fd);
2031
    } else {
2032
        snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
2033
                 "socket: connection from %s:%d",
2034
                 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2035
    }
2036
}
2037

    
2038
static int net_socket_listen_init(VLANState *vlan,
2039
                                  const char *model,
2040
                                  const char *name,
2041
                                  const char *host_str)
2042
{
2043
    NetSocketListenState *s;
2044
    int fd, val, ret;
2045
    struct sockaddr_in saddr;
2046

    
2047
    if (parse_host_port(&saddr, host_str) < 0)
2048
        return -1;
2049

    
2050
    s = qemu_mallocz(sizeof(NetSocketListenState));
2051

    
2052
    fd = socket(PF_INET, SOCK_STREAM, 0);
2053
    if (fd < 0) {
2054
        perror("socket");
2055
        return -1;
2056
    }
2057
    socket_set_nonblock(fd);
2058

    
2059
    /* allow fast reuse */
2060
    val = 1;
2061
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
2062

    
2063
    ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2064
    if (ret < 0) {
2065
        perror("bind");
2066
        return -1;
2067
    }
2068
    ret = listen(fd, 0);
2069
    if (ret < 0) {
2070
        perror("listen");
2071
        return -1;
2072
    }
2073
    s->vlan = vlan;
2074
    s->model = strdup(model);
2075
    s->name = name ? strdup(name) : NULL;
2076
    s->fd = fd;
2077
    qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
2078
    return 0;
2079
}
2080

    
2081
static int net_socket_connect_init(VLANState *vlan,
2082
                                   const char *model,
2083
                                   const char *name,
2084
                                   const char *host_str)
2085
{
2086
    NetSocketState *s;
2087
    int fd, connected, ret, err;
2088
    struct sockaddr_in saddr;
2089

    
2090
    if (parse_host_port(&saddr, host_str) < 0)
2091
        return -1;
2092

    
2093
    fd = socket(PF_INET, SOCK_STREAM, 0);
2094
    if (fd < 0) {
2095
        perror("socket");
2096
        return -1;
2097
    }
2098
    socket_set_nonblock(fd);
2099

    
2100
    connected = 0;
2101
    for(;;) {
2102
        ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
2103
        if (ret < 0) {
2104
            err = socket_error();
2105
            if (err == EINTR || err == EWOULDBLOCK) {
2106
            } else if (err == EINPROGRESS) {
2107
                break;
2108
#ifdef _WIN32
2109
            } else if (err == WSAEALREADY) {
2110
                break;
2111
#endif
2112
            } else {
2113
                perror("connect");
2114
                closesocket(fd);
2115
                return -1;
2116
            }
2117
        } else {
2118
            connected = 1;
2119
            break;
2120
        }
2121
    }
2122
    s = net_socket_fd_init(vlan, model, name, fd, connected);
2123
    if (!s)
2124
        return -1;
2125
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2126
             "socket: connect to %s:%d",
2127
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2128
    return 0;
2129
}
2130

    
2131
static int net_socket_mcast_init(VLANState *vlan,
2132
                                 const char *model,
2133
                                 const char *name,
2134
                                 const char *host_str)
2135
{
2136
    NetSocketState *s;
2137
    int fd;
2138
    struct sockaddr_in saddr;
2139

    
2140
    if (parse_host_port(&saddr, host_str) < 0)
2141
        return -1;
2142

    
2143

    
2144
    fd = net_socket_mcast_create(&saddr);
2145
    if (fd < 0)
2146
        return -1;
2147

    
2148
    s = net_socket_fd_init(vlan, model, name, fd, 0);
2149
    if (!s)
2150
        return -1;
2151

    
2152
    s->dgram_dst = saddr;
2153

    
2154
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
2155
             "socket: mcast=%s:%d",
2156
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
2157
    return 0;
2158

    
2159
}
2160

    
2161
typedef struct DumpState {
2162
    VLANClientState *pcap_vc;
2163
    int fd;
2164
    int pcap_caplen;
2165
} DumpState;
2166

    
2167
#define PCAP_MAGIC 0xa1b2c3d4
2168

    
2169
struct pcap_file_hdr {
2170
    uint32_t magic;
2171
    uint16_t version_major;
2172
    uint16_t version_minor;
2173
    int32_t thiszone;
2174
    uint32_t sigfigs;
2175
    uint32_t snaplen;
2176
    uint32_t linktype;
2177
};
2178

    
2179
struct pcap_sf_pkthdr {
2180
    struct {
2181
        int32_t tv_sec;
2182
        int32_t tv_usec;
2183
    } ts;
2184
    uint32_t caplen;
2185
    uint32_t len;
2186
};
2187

    
2188
static ssize_t dump_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
2189
{
2190
    DumpState *s = vc->opaque;
2191
    struct pcap_sf_pkthdr hdr;
2192
    int64_t ts;
2193
    int caplen;
2194

    
2195
    /* Early return in case of previous error. */
2196
    if (s->fd < 0) {
2197
        return size;
2198
    }
2199

    
2200
    ts = muldiv64(qemu_get_clock(vm_clock), 1000000, ticks_per_sec);
2201
    caplen = size > s->pcap_caplen ? s->pcap_caplen : size;
2202

    
2203
    hdr.ts.tv_sec = ts / 1000000;
2204
    hdr.ts.tv_usec = ts % 1000000;
2205
    hdr.caplen = caplen;
2206
    hdr.len = size;
2207
    if (write(s->fd, &hdr, sizeof(hdr)) != sizeof(hdr) ||
2208
        write(s->fd, buf, caplen) != caplen) {
2209
        qemu_log("-net dump write error - stop dump\n");
2210
        close(s->fd);
2211
        s->fd = -1;
2212
    }
2213

    
2214
    return size;
2215
}
2216

    
2217
static void net_dump_cleanup(VLANClientState *vc)
2218
{
2219
    DumpState *s = vc->opaque;
2220

    
2221
    close(s->fd);
2222
    qemu_free(s);
2223
}
2224

    
2225
static int net_dump_init(Monitor *mon, VLANState *vlan, const char *device,
2226
                         const char *name, const char *filename, int len)
2227
{
2228
    struct pcap_file_hdr hdr;
2229
    DumpState *s;
2230

    
2231
    s = qemu_malloc(sizeof(DumpState));
2232

    
2233
    s->fd = open(filename, O_CREAT | O_WRONLY | O_BINARY, 0644);
2234
    if (s->fd < 0) {
2235
        config_error(mon, "-net dump: can't open %s\n", filename);
2236
        return -1;
2237
    }
2238

    
2239
    s->pcap_caplen = len;
2240

    
2241
    hdr.magic = PCAP_MAGIC;
2242
    hdr.version_major = 2;
2243
    hdr.version_minor = 4;
2244
    hdr.thiszone = 0;
2245
    hdr.sigfigs = 0;
2246
    hdr.snaplen = s->pcap_caplen;
2247
    hdr.linktype = 1;
2248

    
2249
    if (write(s->fd, &hdr, sizeof(hdr)) < sizeof(hdr)) {
2250
        config_error(mon, "-net dump write error: %s\n", strerror(errno));
2251
        close(s->fd);
2252
        qemu_free(s);
2253
        return -1;
2254
    }
2255

    
2256
    s->pcap_vc = qemu_new_vlan_client(vlan, device, name, NULL, dump_receive, NULL,
2257
                                      net_dump_cleanup, s);
2258
    snprintf(s->pcap_vc->info_str, sizeof(s->pcap_vc->info_str),
2259
             "dump to %s (len=%d)", filename, len);
2260
    return 0;
2261
}
2262

    
2263
/* find or alloc a new VLAN */
2264
VLANState *qemu_find_vlan(int id)
2265
{
2266
    VLANState **pvlan, *vlan;
2267
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
2268
        if (vlan->id == id)
2269
            return vlan;
2270
    }
2271
    vlan = qemu_mallocz(sizeof(VLANState));
2272
    vlan->id = id;
2273
    vlan->next = NULL;
2274
    pvlan = &first_vlan;
2275
    while (*pvlan != NULL)
2276
        pvlan = &(*pvlan)->next;
2277
    *pvlan = vlan;
2278
    return vlan;
2279
}
2280

    
2281
static int nic_get_free_idx(void)
2282
{
2283
    int index;
2284

    
2285
    for (index = 0; index < MAX_NICS; index++)
2286
        if (!nd_table[index].used)
2287
            return index;
2288
    return -1;
2289
}
2290

    
2291
void qemu_check_nic_model(NICInfo *nd, const char *model)
2292
{
2293
    const char *models[2];
2294

    
2295
    models[0] = model;
2296
    models[1] = NULL;
2297

    
2298
    qemu_check_nic_model_list(nd, models, model);
2299
}
2300

    
2301
void qemu_check_nic_model_list(NICInfo *nd, const char * const *models,
2302
                               const char *default_model)
2303
{
2304
    int i, exit_status = 0;
2305

    
2306
    if (!nd->model)
2307
        nd->model = strdup(default_model);
2308

    
2309
    if (strcmp(nd->model, "?") != 0) {
2310
        for (i = 0 ; models[i]; i++)
2311
            if (strcmp(nd->model, models[i]) == 0)
2312
                return;
2313

    
2314
        fprintf(stderr, "qemu: Unsupported NIC model: %s\n", nd->model);
2315
        exit_status = 1;
2316
    }
2317

    
2318
    fprintf(stderr, "qemu: Supported NIC models: ");
2319
    for (i = 0 ; models[i]; i++)
2320
        fprintf(stderr, "%s%c", models[i], models[i+1] ? ',' : '\n');
2321

    
2322
    exit(exit_status);
2323
}
2324

    
2325
int net_client_init(Monitor *mon, const char *device, const char *p)
2326
{
2327
    char buf[1024];
2328
    int vlan_id, ret;
2329
    VLANState *vlan;
2330
    char *name = NULL;
2331

    
2332
    vlan_id = 0;
2333
    if (get_param_value(buf, sizeof(buf), "vlan", p)) {
2334
        vlan_id = strtol(buf, NULL, 0);
2335
    }
2336
    vlan = qemu_find_vlan(vlan_id);
2337

    
2338
    if (get_param_value(buf, sizeof(buf), "name", p)) {
2339
        name = qemu_strdup(buf);
2340
    }
2341
    if (!strcmp(device, "nic")) {
2342
        static const char * const nic_params[] = {
2343
            "vlan", "name", "macaddr", "model", "addr", "vectors", NULL
2344
        };
2345
        NICInfo *nd;
2346
        uint8_t *macaddr;
2347
        int idx = nic_get_free_idx();
2348

    
2349
        if (check_params(buf, sizeof(buf), nic_params, p) < 0) {
2350
            config_error(mon, "invalid parameter '%s' in '%s'\n", buf, p);
2351
            ret = -1;
2352
            goto out;
2353
        }
2354
        if (idx == -1 || nb_nics >= MAX_NICS) {
2355
            config_error(mon, "Too Many NICs\n");
2356
            ret = -1;
2357
            goto out;
2358
        }
2359
        nd = &nd_table[idx];
2360
        macaddr = nd->macaddr;
2361
        macaddr[0] = 0x52;
2362
        macaddr[1] = 0x54;
2363
        macaddr[2] = 0x00;
2364
        macaddr[3] = 0x12;
2365
        macaddr[4] = 0x34;
2366
        macaddr[5] = 0x56 + idx;
2367

    
2368
        if (get_param_value(buf, sizeof(buf), "macaddr", p)) {
2369
            if (parse_macaddr(macaddr, buf) < 0) {
2370
                config_error(mon, "invalid syntax for ethernet address\n");
2371
                ret = -1;
2372
                goto out;
2373
            }
2374
        }
2375
        if (get_param_value(buf, sizeof(buf), "model", p)) {
2376
            nd->model = strdup(buf);
2377
        }
2378
        if (get_param_value(buf, sizeof(buf), "addr", p)) {
2379
            nd->devaddr = strdup(buf);
2380
        }
2381
        nd->nvectors = NIC_NVECTORS_UNSPECIFIED;
2382
        if (get_param_value(buf, sizeof(buf), "vectors", p)) {
2383
            char *endptr;
2384
            long vectors = strtol(buf, &endptr, 0);
2385
            if (*endptr) {
2386
                config_error(mon, "invalid syntax for # of vectors\n");
2387
                ret = -1;
2388
                goto out;
2389
            }
2390
            if (vectors < 0 || vectors > 0x7ffffff) {
2391
                config_error(mon, "invalid # of vectors\n");
2392
                ret = -1;
2393
                goto out;
2394
            }
2395
            nd->nvectors = vectors;
2396
        }
2397
        nd->vlan = vlan;
2398
        nd->name = name;
2399
        nd->used = 1;
2400
        name = NULL;
2401
        nb_nics++;
2402
        vlan->nb_guest_devs++;
2403
        ret = idx;
2404
    } else
2405
    if (!strcmp(device, "none")) {
2406
        if (*p != '\0') {
2407
            config_error(mon, "'none' takes no parameters\n");
2408
            ret = -1;
2409
            goto out;
2410
        }
2411
        /* does nothing. It is needed to signal that no network cards
2412
           are wanted */
2413
        ret = 0;
2414
    } else
2415
#ifdef CONFIG_SLIRP
2416
    if (!strcmp(device, "user")) {
2417
        static const char * const slirp_params[] = {
2418
            "vlan", "name", "hostname", "restrict", "ip", "net", "host",
2419
            "tftp", "bootfile", "dhcpstart", "dns", "smb", "smbserver",
2420
            "hostfwd", "guestfwd", NULL
2421
        };
2422
        struct slirp_config_str *config;
2423
        int restricted = 0;
2424
        char *vnet = NULL;
2425
        char *vhost = NULL;
2426
        char *vhostname = NULL;
2427
        char *tftp_export = NULL;
2428
        char *bootfile = NULL;
2429
        char *vdhcp_start = NULL;
2430
        char *vnamesrv = NULL;
2431
        char *smb_export = NULL;
2432
        char *vsmbsrv = NULL;
2433
        const char *q;
2434

    
2435
        if (check_params(buf, sizeof(buf), slirp_params, p) < 0) {
2436
            config_error(mon, "invalid parameter '%s' in '%s'\n", buf, p);
2437
            ret = -1;
2438
            goto out;
2439
        }
2440
        if (get_param_value(buf, sizeof(buf), "ip", p)) {
2441
            /* emulate legacy parameter */
2442
            vnet = qemu_malloc(strlen(buf) + strlen("/24") + 1);
2443
            strcpy(vnet, buf);
2444
            strcat(vnet, "/24");
2445
        }
2446
        if (get_param_value(buf, sizeof(buf), "net", p)) {
2447
            vnet = qemu_strdup(buf);
2448
        }
2449
        if (get_param_value(buf, sizeof(buf), "host", p)) {
2450
            vhost = qemu_strdup(buf);
2451
        }
2452
        if (get_param_value(buf, sizeof(buf), "hostname", p)) {
2453
            vhostname = qemu_strdup(buf);
2454
        }
2455
        if (get_param_value(buf, sizeof(buf), "restrict", p)) {
2456
            restricted = (buf[0] == 'y') ? 1 : 0;
2457
        }
2458
        if (get_param_value(buf, sizeof(buf), "dhcpstart", p)) {
2459
            vdhcp_start = qemu_strdup(buf);
2460
        }
2461
        if (get_param_value(buf, sizeof(buf), "dns", p)) {
2462
            vnamesrv = qemu_strdup(buf);
2463
        }
2464
        if (get_param_value(buf, sizeof(buf), "tftp", p)) {
2465
            tftp_export = qemu_strdup(buf);
2466
        }
2467
        if (get_param_value(buf, sizeof(buf), "bootfile", p)) {
2468
            bootfile = qemu_strdup(buf);
2469
        }
2470
        if (get_param_value(buf, sizeof(buf), "smb", p)) {
2471
            smb_export = qemu_strdup(buf);
2472
            if (get_param_value(buf, sizeof(buf), "smbserver", p)) {
2473
                vsmbsrv = qemu_strdup(buf);
2474
            }
2475
        }
2476
        q = p;
2477
        while (1) {
2478
            config = qemu_malloc(sizeof(*config));
2479
            if (!get_next_param_value(config->str, sizeof(config->str),
2480
                                      "hostfwd", &q)) {
2481
                break;
2482
            }
2483
            config->flags = SLIRP_CFG_HOSTFWD;
2484
            config->next = slirp_configs;
2485
            slirp_configs = config;
2486
            config = NULL;
2487
        }
2488
        q = p;
2489
        while (1) {
2490
            config = qemu_malloc(sizeof(*config));
2491
            if (!get_next_param_value(config->str, sizeof(config->str),
2492
                                      "guestfwd", &q)) {
2493
                break;
2494
            }
2495
            config->flags = 0;
2496
            config->next = slirp_configs;
2497
            slirp_configs = config;
2498
            config = NULL;
2499
        }
2500
        qemu_free(config);
2501
        vlan->nb_host_devs++;
2502
        ret = net_slirp_init(mon, vlan, device, name, restricted, vnet, vhost,
2503
                             vhostname, tftp_export, bootfile, vdhcp_start,
2504
                             vnamesrv, smb_export, vsmbsrv);
2505
        qemu_free(vnet);
2506
        qemu_free(vhost);
2507
        qemu_free(vhostname);
2508
        qemu_free(tftp_export);
2509
        qemu_free(bootfile);
2510
        qemu_free(vdhcp_start);
2511
        qemu_free(vnamesrv);
2512
        qemu_free(smb_export);
2513
        qemu_free(vsmbsrv);
2514
    } else if (!strcmp(device, "channel")) {
2515
        if (!slirp_inited) {
2516
            struct slirp_config_str *config;
2517

    
2518
            config = qemu_malloc(sizeof(*config));
2519
            pstrcpy(config->str, sizeof(config->str), p);
2520
            config->flags = SLIRP_CFG_LEGACY;
2521
            config->next = slirp_configs;
2522
            slirp_configs = config;
2523
        } else {
2524
            slirp_guestfwd(mon, p, 1);
2525
        }
2526
        ret = 0;
2527
    } else
2528
#endif
2529
#ifdef _WIN32
2530
    if (!strcmp(device, "tap")) {
2531
        static const char * const tap_params[] = {
2532
            "vlan", "name", "ifname", NULL
2533
        };
2534
        char ifname[64];
2535

    
2536
        if (check_params(buf, sizeof(buf), tap_params, p) < 0) {
2537
            config_error(mon, "invalid parameter '%s' in '%s'\n", buf, p);
2538
            ret = -1;
2539
            goto out;
2540
        }
2541
        if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
2542
            config_error(mon, "tap: no interface name\n");
2543
            ret = -1;
2544
            goto out;
2545
        }
2546
        vlan->nb_host_devs++;
2547
        ret = tap_win32_init(vlan, device, name, ifname);
2548
    } else
2549
#elif defined (_AIX)
2550
#else
2551
    if (!strcmp(device, "tap")) {
2552
        char ifname[64], chkbuf[64];
2553
        char setup_script[1024], down_script[1024];
2554
        TAPState *s;
2555
        int fd;
2556
        vlan->nb_host_devs++;
2557
        if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
2558
            static const char * const fd_params[] = {
2559
                "vlan", "name", "fd", "sndbuf", NULL
2560
            };
2561
            if (check_params(chkbuf, sizeof(chkbuf), fd_params, p) < 0) {
2562
                config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2563
                ret = -1;
2564
                goto out;
2565
            }
2566
            fd = strtol(buf, NULL, 0);
2567
            fcntl(fd, F_SETFL, O_NONBLOCK);
2568
            s = net_tap_fd_init(vlan, device, name, fd);
2569
        } else {
2570
            static const char * const tap_params[] = {
2571
                "vlan", "name", "ifname", "script", "downscript", "sndbuf", NULL
2572
            };
2573
            if (check_params(chkbuf, sizeof(chkbuf), tap_params, p) < 0) {
2574
                config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2575
                ret = -1;
2576
                goto out;
2577
            }
2578
            if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
2579
                ifname[0] = '\0';
2580
            }
2581
            if (get_param_value(setup_script, sizeof(setup_script), "script", p) == 0) {
2582
                pstrcpy(setup_script, sizeof(setup_script), DEFAULT_NETWORK_SCRIPT);
2583
            }
2584
            if (get_param_value(down_script, sizeof(down_script), "downscript", p) == 0) {
2585
                pstrcpy(down_script, sizeof(down_script), DEFAULT_NETWORK_DOWN_SCRIPT);
2586
            }
2587
            s = net_tap_init(vlan, device, name, ifname, setup_script, down_script);
2588
        }
2589
        if (s != NULL) {
2590
            if (get_param_value(buf, sizeof(buf), "sndbuf", p)) {
2591
                tap_set_sndbuf(s, atoi(buf), mon);
2592
            }
2593
            ret = 0;
2594
        } else {
2595
            ret = -1;
2596
        }
2597
    } else
2598
#endif
2599
    if (!strcmp(device, "socket")) {
2600
        char chkbuf[64];
2601
        if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
2602
            static const char * const fd_params[] = {
2603
                "vlan", "name", "fd", NULL
2604
            };
2605
            int fd;
2606
            if (check_params(chkbuf, sizeof(chkbuf), fd_params, p) < 0) {
2607
                config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2608
                ret = -1;
2609
                goto out;
2610
            }
2611
            fd = strtol(buf, NULL, 0);
2612
            ret = -1;
2613
            if (net_socket_fd_init(vlan, device, name, fd, 1))
2614
                ret = 0;
2615
        } else if (get_param_value(buf, sizeof(buf), "listen", p) > 0) {
2616
            static const char * const listen_params[] = {
2617
                "vlan", "name", "listen", NULL
2618
            };
2619
            if (check_params(chkbuf, sizeof(chkbuf), listen_params, p) < 0) {
2620
                config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2621
                ret = -1;
2622
                goto out;
2623
            }
2624
            ret = net_socket_listen_init(vlan, device, name, buf);
2625
        } else if (get_param_value(buf, sizeof(buf), "connect", p) > 0) {
2626
            static const char * const connect_params[] = {
2627
                "vlan", "name", "connect", NULL
2628
            };
2629
            if (check_params(chkbuf, sizeof(chkbuf), connect_params, p) < 0) {
2630
                config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2631
                ret = -1;
2632
                goto out;
2633
            }
2634
            ret = net_socket_connect_init(vlan, device, name, buf);
2635
        } else if (get_param_value(buf, sizeof(buf), "mcast", p) > 0) {
2636
            static const char * const mcast_params[] = {
2637
                "vlan", "name", "mcast", NULL
2638
            };
2639
            if (check_params(chkbuf, sizeof(chkbuf), mcast_params, p) < 0) {
2640
                config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2641
                ret = -1;
2642
                goto out;
2643
            }
2644
            ret = net_socket_mcast_init(vlan, device, name, buf);
2645
        } else {
2646
            config_error(mon, "Unknown socket options: %s\n", p);
2647
            ret = -1;
2648
            goto out;
2649
        }
2650
        vlan->nb_host_devs++;
2651
    } else
2652
#ifdef CONFIG_VDE
2653
    if (!strcmp(device, "vde")) {
2654
        static const char * const vde_params[] = {
2655
            "vlan", "name", "sock", "port", "group", "mode", NULL
2656
        };
2657
        char vde_sock[1024], vde_group[512];
2658
        int vde_port, vde_mode;
2659

    
2660
        if (check_params(buf, sizeof(buf), vde_params, p) < 0) {
2661
            config_error(mon, "invalid parameter '%s' in '%s'\n", buf, p);
2662
            ret = -1;
2663
            goto out;
2664
        }
2665
        vlan->nb_host_devs++;
2666
        if (get_param_value(vde_sock, sizeof(vde_sock), "sock", p) <= 0) {
2667
            vde_sock[0] = '\0';
2668
        }
2669
        if (get_param_value(buf, sizeof(buf), "port", p) > 0) {
2670
            vde_port = strtol(buf, NULL, 10);
2671
        } else {
2672
            vde_port = 0;
2673
        }
2674
        if (get_param_value(vde_group, sizeof(vde_group), "group", p) <= 0) {
2675
            vde_group[0] = '\0';
2676
        }
2677
        if (get_param_value(buf, sizeof(buf), "mode", p) > 0) {
2678
            vde_mode = strtol(buf, NULL, 8);
2679
        } else {
2680
            vde_mode = 0700;
2681
        }
2682
        ret = net_vde_init(vlan, device, name, vde_sock, vde_port, vde_group, vde_mode);
2683
    } else
2684
#endif
2685
    if (!strcmp(device, "dump")) {
2686
        int len = 65536;
2687

    
2688
        if (get_param_value(buf, sizeof(buf), "len", p) > 0) {
2689
            len = strtol(buf, NULL, 0);
2690
        }
2691
        if (!get_param_value(buf, sizeof(buf), "file", p)) {
2692
            snprintf(buf, sizeof(buf), "qemu-vlan%d.pcap", vlan_id);
2693
        }
2694
        ret = net_dump_init(mon, vlan, device, name, buf, len);
2695
    } else {
2696
        config_error(mon, "Unknown network device: %s\n", device);
2697
        ret = -1;
2698
        goto out;
2699
    }
2700
    if (ret < 0) {
2701
        config_error(mon, "Could not initialize device '%s'\n", device);
2702
    }
2703
out:
2704
    qemu_free(name);
2705
    return ret;
2706
}
2707

    
2708
void net_client_uninit(NICInfo *nd)
2709
{
2710
    nd->vlan->nb_guest_devs--;
2711
    nb_nics--;
2712
    nd->used = 0;
2713
    free((void *)nd->model);
2714
}
2715

    
2716
static int net_host_check_device(const char *device)
2717
{
2718
    int i;
2719
    const char *valid_param_list[] = { "tap", "socket", "dump"
2720
#ifdef CONFIG_SLIRP
2721
                                       ,"user"
2722
#endif
2723
#ifdef CONFIG_VDE
2724
                                       ,"vde"
2725
#endif
2726
    };
2727
    for (i = 0; i < sizeof(valid_param_list) / sizeof(char *); i++) {
2728
        if (!strncmp(valid_param_list[i], device,
2729
                     strlen(valid_param_list[i])))
2730
            return 1;
2731
    }
2732

    
2733
    return 0;
2734
}
2735

    
2736
void net_host_device_add(Monitor *mon, const char *device, const char *opts)
2737
{
2738
    if (!net_host_check_device(device)) {
2739
        monitor_printf(mon, "invalid host network device %s\n", device);
2740
        return;
2741
    }
2742
    if (net_client_init(mon, device, opts ? opts : "") < 0) {
2743
        monitor_printf(mon, "adding host network device %s failed\n", device);
2744
    }
2745
}
2746

    
2747
void net_host_device_remove(Monitor *mon, int vlan_id, const char *device)
2748
{
2749
    VLANState *vlan;
2750
    VLANClientState *vc;
2751

    
2752
    vlan = qemu_find_vlan(vlan_id);
2753

    
2754
    for (vc = vlan->first_client; vc != NULL; vc = vc->next) {
2755
        if (!strcmp(vc->name, device)) {
2756
            break;
2757
        }
2758
    }
2759

    
2760
    if (!vc) {
2761
        monitor_printf(mon, "can't find device %s\n", device);
2762
        return;
2763
    }
2764
    if (!net_host_check_device(vc->model)) {
2765
        monitor_printf(mon, "invalid host network device %s\n", device);
2766
        return;
2767
    }
2768
    qemu_del_vlan_client(vc);
2769
}
2770

    
2771
int net_client_parse(const char *str)
2772
{
2773
    const char *p;
2774
    char *q;
2775
    char device[64];
2776

    
2777
    p = str;
2778
    q = device;
2779
    while (*p != '\0' && *p != ',') {
2780
        if ((q - device) < sizeof(device) - 1)
2781
            *q++ = *p;
2782
        p++;
2783
    }
2784
    *q = '\0';
2785
    if (*p == ',')
2786
        p++;
2787

    
2788
    return net_client_init(NULL, device, p);
2789
}
2790

    
2791
void net_set_boot_mask(int net_boot_mask)
2792
{
2793
    int i;
2794

    
2795
    /* Only the first four NICs may be bootable */
2796
    net_boot_mask = net_boot_mask & 0xF;
2797

    
2798
    for (i = 0; i < nb_nics; i++) {
2799
        if (net_boot_mask & (1 << i)) {
2800
            nd_table[i].bootable = 1;
2801
            net_boot_mask &= ~(1 << i);
2802
        }
2803
    }
2804

    
2805
    if (net_boot_mask) {
2806
        fprintf(stderr, "Cannot boot from non-existent NIC\n");
2807
        exit(1);
2808
    }
2809
}
2810

    
2811
void do_info_network(Monitor *mon)
2812
{
2813
    VLANState *vlan;
2814
    VLANClientState *vc;
2815

    
2816
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
2817
        monitor_printf(mon, "VLAN %d devices:\n", vlan->id);
2818
        for(vc = vlan->first_client; vc != NULL; vc = vc->next)
2819
            monitor_printf(mon, "  %s: %s\n", vc->name, vc->info_str);
2820
    }
2821
}
2822

    
2823
int do_set_link(Monitor *mon, const char *name, const char *up_or_down)
2824
{
2825
    VLANState *vlan;
2826
    VLANClientState *vc = NULL;
2827

    
2828
    for (vlan = first_vlan; vlan != NULL; vlan = vlan->next)
2829
        for (vc = vlan->first_client; vc != NULL; vc = vc->next)
2830
            if (strcmp(vc->name, name) == 0)
2831
                goto done;
2832
done:
2833

    
2834
    if (!vc) {
2835
        monitor_printf(mon, "could not find network device '%s'", name);
2836
        return 0;
2837
    }
2838

    
2839
    if (strcmp(up_or_down, "up") == 0)
2840
        vc->link_down = 0;
2841
    else if (strcmp(up_or_down, "down") == 0)
2842
        vc->link_down = 1;
2843
    else
2844
        monitor_printf(mon, "invalid link status '%s'; only 'up' or 'down' "
2845
                       "valid\n", up_or_down);
2846

    
2847
    if (vc->link_status_changed)
2848
        vc->link_status_changed(vc);
2849

    
2850
    return 1;
2851
}
2852

    
2853
void net_cleanup(void)
2854
{
2855
    VLANState *vlan;
2856

    
2857
    /* close network clients */
2858
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
2859
        VLANClientState *vc = vlan->first_client;
2860

    
2861
        while (vc) {
2862
            VLANClientState *next = vc->next;
2863

    
2864
            qemu_del_vlan_client(vc);
2865

    
2866
            vc = next;
2867
        }
2868
    }
2869
}
2870

    
2871
void net_client_check(void)
2872
{
2873
    VLANState *vlan;
2874

    
2875
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
2876
        if (vlan->nb_guest_devs == 0 && vlan->nb_host_devs == 0)
2877
            continue;
2878
        if (vlan->nb_guest_devs == 0)
2879
            fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id);
2880
        if (vlan->nb_host_devs == 0)
2881
            fprintf(stderr,
2882
                    "Warning: vlan %d is not connected to host network\n",
2883
                    vlan->id);
2884
    }
2885
}