Statistics
| Branch: | Revision:

root / net.c @ 068daedd

History | View | Annotate | Download (65.6 kB)

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

    
32
/* Needed early for 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_flush_queued_packets(VLANClientState *vc)
443
{
444
    VLANPacket *packet;
445

    
446
    while ((packet = vc->vlan->send_queue) != NULL) {
447
        int ret;
448

    
449
        vc->vlan->send_queue = packet->next;
450

    
451
        ret = qemu_deliver_packet(packet->sender, packet->data, packet->size);
452
        if (ret == 0 && packet->sent_cb != NULL) {
453
            packet->next = vc->vlan->send_queue;
454
            vc->vlan->send_queue = packet;
455
            break;
456
        }
457

    
458
        if (packet->sent_cb)
459
            packet->sent_cb(packet->sender);
460

    
461
        qemu_free(packet);
462
    }
463
}
464

    
465
static void qemu_enqueue_packet(VLANClientState *sender,
466
                                const uint8_t *buf, int size,
467
                                NetPacketSent *sent_cb)
468
{
469
    VLANPacket *packet;
470

    
471
    packet = qemu_malloc(sizeof(VLANPacket) + size);
472
    packet->next = sender->vlan->send_queue;
473
    packet->sender = sender;
474
    packet->size = size;
475
    packet->sent_cb = sent_cb;
476
    memcpy(packet->data, buf, size);
477
    sender->vlan->send_queue = packet;
478
}
479

    
480
ssize_t qemu_send_packet_async(VLANClientState *sender,
481
                               const uint8_t *buf, int size,
482
                               NetPacketSent *sent_cb)
483
{
484
    int ret;
485

    
486
    if (sender->link_down) {
487
        return size;
488
    }
489

    
490
#ifdef DEBUG_NET
491
    printf("vlan %d send:\n", sender->vlan->id);
492
    hex_dump(stdout, buf, size);
493
#endif
494

    
495
    if (sender->vlan->delivering) {
496
        qemu_enqueue_packet(sender, buf, size, NULL);
497
        return size;
498
    }
499

    
500
    ret = qemu_deliver_packet(sender, buf, size);
501
    if (ret == 0 && sent_cb != NULL) {
502
        qemu_enqueue_packet(sender, buf, size, sent_cb);
503
        return 0;
504
    }
505

    
506
    qemu_flush_queued_packets(sender);
507

    
508
    return ret;
509
}
510

    
511
void qemu_send_packet(VLANClientState *vc, const uint8_t *buf, int size)
512
{
513
    qemu_send_packet_async(vc, buf, size, NULL);
514
}
515

    
516
static ssize_t vc_sendv_compat(VLANClientState *vc, const struct iovec *iov,
517
                               int iovcnt)
518
{
519
    uint8_t buffer[4096];
520
    size_t offset = 0;
521
    int i;
522

    
523
    for (i = 0; i < iovcnt; i++) {
524
        size_t len;
525

    
526
        len = MIN(sizeof(buffer) - offset, iov[i].iov_len);
527
        memcpy(buffer + offset, iov[i].iov_base, len);
528
        offset += len;
529
    }
530

    
531
    return vc->receive(vc, buffer, offset);
532
}
533

    
534
static ssize_t calc_iov_length(const struct iovec *iov, int iovcnt)
535
{
536
    size_t offset = 0;
537
    int i;
538

    
539
    for (i = 0; i < iovcnt; i++)
540
        offset += iov[i].iov_len;
541
    return offset;
542
}
543

    
544
static int qemu_deliver_packet_iov(VLANClientState *sender,
545
                                   const struct iovec *iov, int iovcnt)
546
{
547
    VLANClientState *vc;
548
    int ret = -1;
549

    
550
    sender->vlan->delivering = 1;
551

    
552
    for (vc = sender->vlan->first_client; vc != NULL; vc = vc->next) {
553
        ssize_t len;
554

    
555
        if (vc == sender) {
556
            continue;
557
        }
558

    
559
        if (vc->link_down) {
560
            ret = calc_iov_length(iov, iovcnt);
561
            continue;
562
        }
563

    
564
        if (vc->receive_iov) {
565
            len = vc->receive_iov(vc, iov, iovcnt);
566
        } else {
567
            len = vc_sendv_compat(vc, iov, iovcnt);
568
        }
569

    
570
        ret = (ret >= 0) ? ret : len;
571
    }
572

    
573
    sender->vlan->delivering = 0;
574

    
575
    return ret;
576
}
577

    
578
static ssize_t qemu_enqueue_packet_iov(VLANClientState *sender,
579
                                       const struct iovec *iov, int iovcnt,
580
                                       NetPacketSent *sent_cb)
581
{
582
    VLANPacket *packet;
583
    size_t max_len = 0;
584
    int i;
585

    
586
    max_len = calc_iov_length(iov, iovcnt);
587

    
588
    packet = qemu_malloc(sizeof(VLANPacket) + max_len);
589
    packet->next = sender->vlan->send_queue;
590
    packet->sender = sender;
591
    packet->sent_cb = sent_cb;
592
    packet->size = 0;
593

    
594
    for (i = 0; i < iovcnt; i++) {
595
        size_t len = iov[i].iov_len;
596

    
597
        memcpy(packet->data + packet->size, iov[i].iov_base, len);
598
        packet->size += len;
599
    }
600

    
601
    sender->vlan->send_queue = packet;
602

    
603
    return packet->size;
604
}
605

    
606
ssize_t qemu_sendv_packet_async(VLANClientState *sender,
607
                                const struct iovec *iov, int iovcnt,
608
                                NetPacketSent *sent_cb)
609
{
610
    int ret;
611

    
612
    if (sender->link_down) {
613
        return calc_iov_length(iov, iovcnt);
614
    }
615

    
616
    if (sender->vlan->delivering) {
617
        return qemu_enqueue_packet_iov(sender, iov, iovcnt, NULL);
618
    }
619

    
620
    ret = qemu_deliver_packet_iov(sender, iov, iovcnt);
621
    if (ret == 0 && sent_cb != NULL) {
622
        qemu_enqueue_packet_iov(sender, iov, iovcnt, sent_cb);
623
        return 0;
624
    }
625

    
626
    qemu_flush_queued_packets(sender);
627

    
628
    return ret;
629
}
630

    
631
ssize_t
632
qemu_sendv_packet(VLANClientState *vc, const struct iovec *iov, int iovcnt)
633
{
634
    return qemu_sendv_packet_async(vc, iov, iovcnt, NULL);
635
}
636

    
637
static void config_error(Monitor *mon, const char *fmt, ...)
638
{
639
    va_list ap;
640

    
641
    va_start(ap, fmt);
642
    if (mon) {
643
        monitor_vprintf(mon, fmt, ap);
644
    } else {
645
        fprintf(stderr, "qemu: ");
646
        vfprintf(stderr, fmt, ap);
647
        exit(1);
648
    }
649
    va_end(ap);
650
}
651

    
652
#if defined(CONFIG_SLIRP)
653

    
654
/* slirp network adapter */
655

    
656
struct slirp_config_str {
657
    struct slirp_config_str *next;
658
    const char *str;
659
};
660

    
661
static int slirp_inited;
662
static struct slirp_config_str *slirp_redirs;
663
#ifndef _WIN32
664
static const char *slirp_smb_export;
665
#endif
666
static VLANClientState *slirp_vc;
667

    
668
static void slirp_smb(const char *exported_dir);
669
static void slirp_redirection(Monitor *mon, const char *redir_str);
670

    
671
int slirp_can_output(void)
672
{
673
    return !slirp_vc || qemu_can_send_packet(slirp_vc);
674
}
675

    
676
void slirp_output(const uint8_t *pkt, int pkt_len)
677
{
678
#ifdef DEBUG_SLIRP
679
    printf("slirp output:\n");
680
    hex_dump(stdout, pkt, pkt_len);
681
#endif
682
    if (!slirp_vc)
683
        return;
684
    qemu_send_packet(slirp_vc, pkt, pkt_len);
685
}
686

    
687
int slirp_is_inited(void)
688
{
689
    return slirp_inited;
690
}
691

    
692
static ssize_t slirp_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
693
{
694
#ifdef DEBUG_SLIRP
695
    printf("slirp input:\n");
696
    hex_dump(stdout, buf, size);
697
#endif
698
    slirp_input(buf, size);
699
    return size;
700
}
701

    
702
static int slirp_in_use;
703

    
704
static void net_slirp_cleanup(VLANClientState *vc)
705
{
706
    slirp_in_use = 0;
707
}
708

    
709
static int net_slirp_init(VLANState *vlan, const char *model, const char *name,
710
                          int restricted, const char *ip)
711
{
712
    if (slirp_in_use) {
713
        /* slirp only supports a single instance so far */
714
        return -1;
715
    }
716
    if (!slirp_inited) {
717
        slirp_inited = 1;
718
        slirp_init(restricted, ip);
719

    
720
        while (slirp_redirs) {
721
            struct slirp_config_str *config = slirp_redirs;
722

    
723
            slirp_redirection(NULL, config->str);
724
            slirp_redirs = config->next;
725
            qemu_free(config);
726
        }
727
#ifndef _WIN32
728
        if (slirp_smb_export) {
729
            slirp_smb(slirp_smb_export);
730
        }
731
#endif
732
    }
733

    
734
    slirp_vc = qemu_new_vlan_client(vlan, model, name, NULL, slirp_receive,
735
                                    NULL, net_slirp_cleanup, NULL);
736
    slirp_vc->info_str[0] = '\0';
737
    slirp_in_use = 1;
738
    return 0;
739
}
740

    
741
static void net_slirp_redir_print(void *opaque, int is_udp,
742
                                  struct in_addr *laddr, u_int lport,
743
                                  struct in_addr *faddr, u_int fport)
744
{
745
    Monitor *mon = (Monitor *)opaque;
746
    uint32_t h_addr;
747
    uint32_t g_addr;
748
    char buf[16];
749

    
750
    h_addr = ntohl(faddr->s_addr);
751
    g_addr = ntohl(laddr->s_addr);
752

    
753
    monitor_printf(mon, "  %s |", is_udp ? "udp" : "tcp" );
754
    snprintf(buf, 15, "%d.%d.%d.%d", (h_addr >> 24) & 0xff,
755
                                     (h_addr >> 16) & 0xff,
756
                                     (h_addr >> 8) & 0xff,
757
                                     (h_addr) & 0xff);
758
    monitor_printf(mon, " %15s |", buf);
759
    monitor_printf(mon, " %5d |", fport);
760

    
761
    snprintf(buf, 15, "%d.%d.%d.%d", (g_addr >> 24) & 0xff,
762
                                     (g_addr >> 16) & 0xff,
763
                                     (g_addr >> 8) & 0xff,
764
                                     (g_addr) & 0xff);
765
    monitor_printf(mon, " %15s |", buf);
766
    monitor_printf(mon, " %5d\n", lport);
767

    
768
}
769

    
770
static void net_slirp_redir_list(Monitor *mon)
771
{
772
    if (!mon)
773
        return;
774

    
775
    monitor_printf(mon, " Prot |    Host Addr    | HPort |    Guest Addr   | GPort\n");
776
    monitor_printf(mon, "      |                 |       |                 |      \n");
777
    slirp_redir_loop(net_slirp_redir_print, mon);
778
}
779

    
780
static void net_slirp_redir_rm(Monitor *mon, const char *port_str)
781
{
782
    int host_port;
783
    char buf[256] = "";
784
    const char *p = port_str;
785
    int is_udp = 0;
786
    int n;
787

    
788
    if (!mon)
789
        return;
790

    
791
    if (!port_str || !port_str[0])
792
        goto fail_syntax;
793

    
794
    get_str_sep(buf, sizeof(buf), &p, ':');
795

    
796
    if (!strcmp(buf, "tcp") || buf[0] == '\0') {
797
        is_udp = 0;
798
    } else if (!strcmp(buf, "udp")) {
799
        is_udp = 1;
800
    } else {
801
        goto fail_syntax;
802
    }
803

    
804
    host_port = atoi(p);
805

    
806
    n = slirp_redir_rm(is_udp, host_port);
807

    
808
    monitor_printf(mon, "removed %d redirections to %s port %d\n", n,
809
                        is_udp ? "udp" : "tcp", host_port);
810
    return;
811

    
812
 fail_syntax:
813
    monitor_printf(mon, "invalid format\n");
814
}
815

    
816
static void slirp_redirection(Monitor *mon, const char *redir_str)
817
{
818
    struct in_addr guest_addr;
819
    int host_port, guest_port;
820
    const char *p;
821
    char buf[256], *r;
822
    int is_udp;
823

    
824
    p = redir_str;
825
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
826
        goto fail_syntax;
827
    }
828
    if (!strcmp(buf, "tcp") || buf[0] == '\0') {
829
        is_udp = 0;
830
    } else if (!strcmp(buf, "udp")) {
831
        is_udp = 1;
832
    } else {
833
        goto fail_syntax;
834
    }
835

    
836
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
837
        goto fail_syntax;
838
    }
839
    host_port = strtol(buf, &r, 0);
840
    if (r == buf) {
841
        goto fail_syntax;
842
    }
843

    
844
    if (get_str_sep(buf, sizeof(buf), &p, ':') < 0) {
845
        goto fail_syntax;
846
    }
847
    if (buf[0] == '\0') {
848
        pstrcpy(buf, sizeof(buf), "10.0.2.15");
849
    }
850
    if (!inet_aton(buf, &guest_addr)) {
851
        goto fail_syntax;
852
    }
853

    
854
    guest_port = strtol(p, &r, 0);
855
    if (r == p) {
856
        goto fail_syntax;
857
    }
858

    
859
    if (slirp_redir(is_udp, host_port, guest_addr, guest_port) < 0) {
860
        config_error(mon, "could not set up redirection '%s'\n", redir_str);
861
    }
862
    return;
863

    
864
 fail_syntax:
865
    config_error(mon, "invalid redirection format '%s'\n", redir_str);
866
}
867

    
868
void net_slirp_redir(Monitor *mon, const char *redir_str, const char *redir_opt2)
869
{
870
    struct slirp_config_str *config;
871

    
872
    if (!slirp_inited) {
873
        if (mon) {
874
            monitor_printf(mon, "user mode network stack not in use\n");
875
        } else {
876
            config = qemu_malloc(sizeof(*config));
877
            config->str = redir_str;
878
            config->next = slirp_redirs;
879
            slirp_redirs = config;
880
        }
881
        return;
882
    }
883

    
884
    if (!strcmp(redir_str, "remove")) {
885
        net_slirp_redir_rm(mon, redir_opt2);
886
        return;
887
    }
888

    
889
    if (!strcmp(redir_str, "list")) {
890
        net_slirp_redir_list(mon);
891
        return;
892
    }
893

    
894
    slirp_redirection(mon, redir_str);
895
}
896

    
897
#ifndef _WIN32
898

    
899
static char smb_dir[1024];
900

    
901
static void erase_dir(char *dir_name)
902
{
903
    DIR *d;
904
    struct dirent *de;
905
    char filename[1024];
906

    
907
    /* erase all the files in the directory */
908
    if ((d = opendir(dir_name)) != NULL) {
909
        for(;;) {
910
            de = readdir(d);
911
            if (!de)
912
                break;
913
            if (strcmp(de->d_name, ".") != 0 &&
914
                strcmp(de->d_name, "..") != 0) {
915
                snprintf(filename, sizeof(filename), "%s/%s",
916
                         smb_dir, de->d_name);
917
                if (unlink(filename) != 0)  /* is it a directory? */
918
                    erase_dir(filename);
919
            }
920
        }
921
        closedir(d);
922
        rmdir(dir_name);
923
    }
924
}
925

    
926
/* automatic user mode samba server configuration */
927
static void smb_exit(void)
928
{
929
    erase_dir(smb_dir);
930
}
931

    
932
static void slirp_smb(const char *exported_dir)
933
{
934
    char smb_conf[1024];
935
    char smb_cmdline[1024];
936
    FILE *f;
937

    
938
    /* XXX: better tmp dir construction */
939
    snprintf(smb_dir, sizeof(smb_dir), "/tmp/qemu-smb.%ld", (long)getpid());
940
    if (mkdir(smb_dir, 0700) < 0) {
941
        fprintf(stderr, "qemu: could not create samba server dir '%s'\n", smb_dir);
942
        exit(1);
943
    }
944
    snprintf(smb_conf, sizeof(smb_conf), "%s/%s", smb_dir, "smb.conf");
945

    
946
    f = fopen(smb_conf, "w");
947
    if (!f) {
948
        fprintf(stderr, "qemu: could not create samba server configuration file '%s'\n", smb_conf);
949
        exit(1);
950
    }
951
    fprintf(f,
952
            "[global]\n"
953
            "private dir=%s\n"
954
            "smb ports=0\n"
955
            "socket address=127.0.0.1\n"
956
            "pid directory=%s\n"
957
            "lock directory=%s\n"
958
            "log file=%s/log.smbd\n"
959
            "smb passwd file=%s/smbpasswd\n"
960
            "security = share\n"
961
            "[qemu]\n"
962
            "path=%s\n"
963
            "read only=no\n"
964
            "guest ok=yes\n",
965
            smb_dir,
966
            smb_dir,
967
            smb_dir,
968
            smb_dir,
969
            smb_dir,
970
            exported_dir
971
            );
972
    fclose(f);
973
    atexit(smb_exit);
974

    
975
    snprintf(smb_cmdline, sizeof(smb_cmdline), "%s -s %s",
976
             SMBD_COMMAND, smb_conf);
977

    
978
    slirp_add_exec(0, smb_cmdline, 4, 139);
979
}
980

    
981
/* automatic user mode samba server configuration */
982
void net_slirp_smb(const char *exported_dir)
983
{
984
    if (slirp_smb_export) {
985
        fprintf(stderr, "-smb given twice\n");
986
        exit(1);
987
    }
988
    slirp_smb_export = exported_dir;
989
    if (slirp_inited) {
990
        slirp_smb(exported_dir);
991
    }
992
}
993

    
994
#endif /* !defined(_WIN32) */
995

    
996
void do_info_slirp(Monitor *mon)
997
{
998
    slirp_stats();
999
}
1000

    
1001
struct VMChannel {
1002
    CharDriverState *hd;
1003
    int port;
1004
};
1005

    
1006
static int vmchannel_can_read(void *opaque)
1007
{
1008
    struct VMChannel *vmc = (struct VMChannel*)opaque;
1009
    return slirp_socket_can_recv(4, vmc->port);
1010
}
1011

    
1012
static void vmchannel_read(void *opaque, const uint8_t *buf, int size)
1013
{
1014
    struct VMChannel *vmc = (struct VMChannel*)opaque;
1015
    slirp_socket_recv(4, vmc->port, buf, size);
1016
}
1017

    
1018
#endif /* CONFIG_SLIRP */
1019

    
1020
#if !defined(_WIN32)
1021

    
1022
typedef struct TAPState {
1023
    VLANClientState *vc;
1024
    int fd;
1025
    char down_script[1024];
1026
    char down_script_arg[128];
1027
    uint8_t buf[4096];
1028
} TAPState;
1029

    
1030
static int launch_script(const char *setup_script, const char *ifname, int fd);
1031

    
1032
static ssize_t tap_receive_iov(VLANClientState *vc, const struct iovec *iov,
1033
                               int iovcnt)
1034
{
1035
    TAPState *s = vc->opaque;
1036
    ssize_t len;
1037

    
1038
    do {
1039
        len = writev(s->fd, iov, iovcnt);
1040
    } while (len == -1 && (errno == EINTR || errno == EAGAIN));
1041

    
1042
    return len;
1043
}
1044

    
1045
static ssize_t tap_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1046
{
1047
    TAPState *s = vc->opaque;
1048
    ssize_t len;
1049

    
1050
    do {
1051
        len = write(s->fd, buf, size);
1052
    } while (len == -1 && (errno == EINTR || errno == EAGAIN));
1053

    
1054
    return len;
1055
}
1056

    
1057
static int tap_can_send(void *opaque)
1058
{
1059
    TAPState *s = opaque;
1060

    
1061
    return qemu_can_send_packet(s->vc);
1062
}
1063

    
1064
#ifdef __sun__
1065
static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1066
{
1067
    struct strbuf sbuf;
1068
    int f = 0;
1069

    
1070
    sbuf.maxlen = maxlen;
1071
    sbuf.buf = (char *)buf;
1072

    
1073
    return getmsg(tapfd, NULL, &sbuf, &f) >= 0 ? sbuf.len : -1;
1074
}
1075
#else
1076
static ssize_t tap_read_packet(int tapfd, uint8_t *buf, int maxlen)
1077
{
1078
    return read(tapfd, buf, maxlen);
1079
}
1080
#endif
1081

    
1082
static void tap_send(void *opaque);
1083

    
1084
static void tap_send_completed(VLANClientState *vc)
1085
{
1086
    TAPState *s = vc->opaque;
1087

    
1088
    qemu_set_fd_handler2(s->fd, tap_can_send, tap_send, NULL, s);
1089
}
1090

    
1091
static void tap_send(void *opaque)
1092
{
1093
    TAPState *s = opaque;
1094
    int size;
1095

    
1096
    do {
1097
        size = tap_read_packet(s->fd, s->buf, sizeof(s->buf));
1098
        if (size <= 0) {
1099
            break;
1100
        }
1101

    
1102
        size = qemu_send_packet_async(s->vc, s->buf, size, tap_send_completed);
1103
        if (size == 0) {
1104
            qemu_set_fd_handler2(s->fd, NULL, NULL, NULL, NULL);
1105
        }
1106
    } while (size > 0);
1107
}
1108

    
1109
static void tap_cleanup(VLANClientState *vc)
1110
{
1111
    TAPState *s = vc->opaque;
1112

    
1113
    if (s->down_script[0])
1114
        launch_script(s->down_script, s->down_script_arg, s->fd);
1115

    
1116
    qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1117
    close(s->fd);
1118
    qemu_free(s);
1119
}
1120

    
1121
/* fd support */
1122

    
1123
static TAPState *net_tap_fd_init(VLANState *vlan,
1124
                                 const char *model,
1125
                                 const char *name,
1126
                                 int fd)
1127
{
1128
    TAPState *s;
1129

    
1130
    s = qemu_mallocz(sizeof(TAPState));
1131
    s->fd = fd;
1132
    s->vc = qemu_new_vlan_client(vlan, model, name, NULL, tap_receive,
1133
                                 tap_receive_iov, tap_cleanup, s);
1134
    qemu_set_fd_handler2(s->fd, tap_can_send, tap_send, NULL, s);
1135
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), "fd=%d", fd);
1136
    return s;
1137
}
1138

    
1139
#if defined (HOST_BSD) || defined (__FreeBSD_kernel__)
1140
static int tap_open(char *ifname, int ifname_size)
1141
{
1142
    int fd;
1143
    char *dev;
1144
    struct stat s;
1145

    
1146
    TFR(fd = open("/dev/tap", O_RDWR));
1147
    if (fd < 0) {
1148
        fprintf(stderr, "warning: could not open /dev/tap: no virtual network emulation\n");
1149
        return -1;
1150
    }
1151

    
1152
    fstat(fd, &s);
1153
    dev = devname(s.st_rdev, S_IFCHR);
1154
    pstrcpy(ifname, ifname_size, dev);
1155

    
1156
    fcntl(fd, F_SETFL, O_NONBLOCK);
1157
    return fd;
1158
}
1159
#elif defined(__sun__)
1160
#define TUNNEWPPA       (('T'<<16) | 0x0001)
1161
/*
1162
 * Allocate TAP device, returns opened fd.
1163
 * Stores dev name in the first arg(must be large enough).
1164
 */
1165
static int tap_alloc(char *dev, size_t dev_size)
1166
{
1167
    int tap_fd, if_fd, ppa = -1;
1168
    static int ip_fd = 0;
1169
    char *ptr;
1170

    
1171
    static int arp_fd = 0;
1172
    int ip_muxid, arp_muxid;
1173
    struct strioctl  strioc_if, strioc_ppa;
1174
    int link_type = I_PLINK;;
1175
    struct lifreq ifr;
1176
    char actual_name[32] = "";
1177

    
1178
    memset(&ifr, 0x0, sizeof(ifr));
1179

    
1180
    if( *dev ){
1181
       ptr = dev;
1182
       while( *ptr && !qemu_isdigit((int)*ptr) ) ptr++;
1183
       ppa = atoi(ptr);
1184
    }
1185

    
1186
    /* Check if IP device was opened */
1187
    if( ip_fd )
1188
       close(ip_fd);
1189

    
1190
    TFR(ip_fd = open("/dev/udp", O_RDWR, 0));
1191
    if (ip_fd < 0) {
1192
       syslog(LOG_ERR, "Can't open /dev/ip (actually /dev/udp)");
1193
       return -1;
1194
    }
1195

    
1196
    TFR(tap_fd = open("/dev/tap", O_RDWR, 0));
1197
    if (tap_fd < 0) {
1198
       syslog(LOG_ERR, "Can't open /dev/tap");
1199
       return -1;
1200
    }
1201

    
1202
    /* Assign a new PPA and get its unit number. */
1203
    strioc_ppa.ic_cmd = TUNNEWPPA;
1204
    strioc_ppa.ic_timout = 0;
1205
    strioc_ppa.ic_len = sizeof(ppa);
1206
    strioc_ppa.ic_dp = (char *)&ppa;
1207
    if ((ppa = ioctl (tap_fd, I_STR, &strioc_ppa)) < 0)
1208
       syslog (LOG_ERR, "Can't assign new interface");
1209

    
1210
    TFR(if_fd = open("/dev/tap", O_RDWR, 0));
1211
    if (if_fd < 0) {
1212
       syslog(LOG_ERR, "Can't open /dev/tap (2)");
1213
       return -1;
1214
    }
1215
    if(ioctl(if_fd, I_PUSH, "ip") < 0){
1216
       syslog(LOG_ERR, "Can't push IP module");
1217
       return -1;
1218
    }
1219

    
1220
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) < 0)
1221
        syslog(LOG_ERR, "Can't get flags\n");
1222

    
1223
    snprintf (actual_name, 32, "tap%d", ppa);
1224
    pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
1225

    
1226
    ifr.lifr_ppa = ppa;
1227
    /* Assign ppa according to the unit number returned by tun device */
1228

    
1229
    if (ioctl (if_fd, SIOCSLIFNAME, &ifr) < 0)
1230
        syslog (LOG_ERR, "Can't set PPA %d", ppa);
1231
    if (ioctl(if_fd, SIOCGLIFFLAGS, &ifr) <0)
1232
        syslog (LOG_ERR, "Can't get flags\n");
1233
    /* Push arp module to if_fd */
1234
    if (ioctl (if_fd, I_PUSH, "arp") < 0)
1235
        syslog (LOG_ERR, "Can't push ARP module (2)");
1236

    
1237
    /* Push arp module to ip_fd */
1238
    if (ioctl (ip_fd, I_POP, NULL) < 0)
1239
        syslog (LOG_ERR, "I_POP failed\n");
1240
    if (ioctl (ip_fd, I_PUSH, "arp") < 0)
1241
        syslog (LOG_ERR, "Can't push ARP module (3)\n");
1242
    /* Open arp_fd */
1243
    TFR(arp_fd = open ("/dev/tap", O_RDWR, 0));
1244
    if (arp_fd < 0)
1245
       syslog (LOG_ERR, "Can't open %s\n", "/dev/tap");
1246

    
1247
    /* Set ifname to arp */
1248
    strioc_if.ic_cmd = SIOCSLIFNAME;
1249
    strioc_if.ic_timout = 0;
1250
    strioc_if.ic_len = sizeof(ifr);
1251
    strioc_if.ic_dp = (char *)&ifr;
1252
    if (ioctl(arp_fd, I_STR, &strioc_if) < 0){
1253
        syslog (LOG_ERR, "Can't set ifname to arp\n");
1254
    }
1255

    
1256
    if((ip_muxid = ioctl(ip_fd, I_LINK, if_fd)) < 0){
1257
       syslog(LOG_ERR, "Can't link TAP device to IP");
1258
       return -1;
1259
    }
1260

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

    
1264
    close (if_fd);
1265

    
1266
    memset(&ifr, 0x0, sizeof(ifr));
1267
    pstrcpy(ifr.lifr_name, sizeof(ifr.lifr_name), actual_name);
1268
    ifr.lifr_ip_muxid  = ip_muxid;
1269
    ifr.lifr_arp_muxid = arp_muxid;
1270

    
1271
    if (ioctl (ip_fd, SIOCSLIFMUXID, &ifr) < 0)
1272
    {
1273
      ioctl (ip_fd, I_PUNLINK , arp_muxid);
1274
      ioctl (ip_fd, I_PUNLINK, ip_muxid);
1275
      syslog (LOG_ERR, "Can't set multiplexor id");
1276
    }
1277

    
1278
    snprintf(dev, dev_size, "tap%d", ppa);
1279
    return tap_fd;
1280
}
1281

    
1282
static int tap_open(char *ifname, int ifname_size)
1283
{
1284
    char  dev[10]="";
1285
    int fd;
1286
    if( (fd = tap_alloc(dev, sizeof(dev))) < 0 ){
1287
       fprintf(stderr, "Cannot allocate TAP device\n");
1288
       return -1;
1289
    }
1290
    pstrcpy(ifname, ifname_size, dev);
1291
    fcntl(fd, F_SETFL, O_NONBLOCK);
1292
    return fd;
1293
}
1294
#elif defined (_AIX)
1295
static int tap_open(char *ifname, int ifname_size)
1296
{
1297
    fprintf (stderr, "no tap on AIX\n");
1298
    return -1;
1299
}
1300
#else
1301
static int tap_open(char *ifname, int ifname_size)
1302
{
1303
    struct ifreq ifr;
1304
    int fd, ret;
1305

    
1306
    TFR(fd = open("/dev/net/tun", O_RDWR));
1307
    if (fd < 0) {
1308
        fprintf(stderr, "warning: could not open /dev/net/tun: no virtual network emulation\n");
1309
        return -1;
1310
    }
1311
    memset(&ifr, 0, sizeof(ifr));
1312
    ifr.ifr_flags = IFF_TAP | IFF_NO_PI;
1313
    if (ifname[0] != '\0')
1314
        pstrcpy(ifr.ifr_name, IFNAMSIZ, ifname);
1315
    else
1316
        pstrcpy(ifr.ifr_name, IFNAMSIZ, "tap%d");
1317
    ret = ioctl(fd, TUNSETIFF, (void *) &ifr);
1318
    if (ret != 0) {
1319
        fprintf(stderr, "warning: could not configure /dev/net/tun: no virtual network emulation\n");
1320
        close(fd);
1321
        return -1;
1322
    }
1323
    pstrcpy(ifname, ifname_size, ifr.ifr_name);
1324
    fcntl(fd, F_SETFL, O_NONBLOCK);
1325
    return fd;
1326
}
1327
#endif
1328

    
1329
static int launch_script(const char *setup_script, const char *ifname, int fd)
1330
{
1331
    sigset_t oldmask, mask;
1332
    int pid, status;
1333
    char *args[3];
1334
    char **parg;
1335

    
1336
    sigemptyset(&mask);
1337
    sigaddset(&mask, SIGCHLD);
1338
    sigprocmask(SIG_BLOCK, &mask, &oldmask);
1339

    
1340
    /* try to launch network script */
1341
    pid = fork();
1342
    if (pid == 0) {
1343
        int open_max = sysconf(_SC_OPEN_MAX), i;
1344

    
1345
        for (i = 0; i < open_max; i++) {
1346
            if (i != STDIN_FILENO &&
1347
                i != STDOUT_FILENO &&
1348
                i != STDERR_FILENO &&
1349
                i != fd) {
1350
                close(i);
1351
            }
1352
        }
1353
        parg = args;
1354
        *parg++ = (char *)setup_script;
1355
        *parg++ = (char *)ifname;
1356
        *parg++ = NULL;
1357
        execv(setup_script, args);
1358
        _exit(1);
1359
    } else if (pid > 0) {
1360
        while (waitpid(pid, &status, 0) != pid) {
1361
            /* loop */
1362
        }
1363
        sigprocmask(SIG_SETMASK, &oldmask, NULL);
1364

    
1365
        if (WIFEXITED(status) && WEXITSTATUS(status) == 0) {
1366
            return 0;
1367
        }
1368
    }
1369
    fprintf(stderr, "%s: could not launch network script\n", setup_script);
1370
    return -1;
1371
}
1372

    
1373
static int net_tap_init(VLANState *vlan, const char *model,
1374
                        const char *name, const char *ifname1,
1375
                        const char *setup_script, const char *down_script)
1376
{
1377
    TAPState *s;
1378
    int fd;
1379
    char ifname[128];
1380

    
1381
    if (ifname1 != NULL)
1382
        pstrcpy(ifname, sizeof(ifname), ifname1);
1383
    else
1384
        ifname[0] = '\0';
1385
    TFR(fd = tap_open(ifname, sizeof(ifname)));
1386
    if (fd < 0)
1387
        return -1;
1388

    
1389
    if (!setup_script || !strcmp(setup_script, "no"))
1390
        setup_script = "";
1391
    if (setup_script[0] != '\0') {
1392
        if (launch_script(setup_script, ifname, fd))
1393
            return -1;
1394
    }
1395
    s = net_tap_fd_init(vlan, model, name, fd);
1396
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1397
             "ifname=%s,script=%s,downscript=%s",
1398
             ifname, setup_script, down_script);
1399
    if (down_script && strcmp(down_script, "no")) {
1400
        snprintf(s->down_script, sizeof(s->down_script), "%s", down_script);
1401
        snprintf(s->down_script_arg, sizeof(s->down_script_arg), "%s", ifname);
1402
    }
1403
    return 0;
1404
}
1405

    
1406
#endif /* !_WIN32 */
1407

    
1408
#if defined(CONFIG_VDE)
1409
typedef struct VDEState {
1410
    VLANClientState *vc;
1411
    VDECONN *vde;
1412
} VDEState;
1413

    
1414
static void vde_to_qemu(void *opaque)
1415
{
1416
    VDEState *s = opaque;
1417
    uint8_t buf[4096];
1418
    int size;
1419

    
1420
    size = vde_recv(s->vde, (char *)buf, sizeof(buf), 0);
1421
    if (size > 0) {
1422
        qemu_send_packet(s->vc, buf, size);
1423
    }
1424
}
1425

    
1426
static ssize_t vde_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1427
{
1428
    VDEState *s = vc->opaque;
1429
    ssize_t ret;
1430

    
1431
    do {
1432
      ret = vde_send(s->vde, (const char *)buf, size, 0);
1433
    } while (ret < 0 && errno == EINTR);
1434

    
1435
    return ret;
1436
}
1437

    
1438
static void vde_cleanup(VLANClientState *vc)
1439
{
1440
    VDEState *s = vc->opaque;
1441
    qemu_set_fd_handler(vde_datafd(s->vde), NULL, NULL, NULL);
1442
    vde_close(s->vde);
1443
    qemu_free(s);
1444
}
1445

    
1446
static int net_vde_init(VLANState *vlan, const char *model,
1447
                        const char *name, const char *sock,
1448
                        int port, const char *group, int mode)
1449
{
1450
    VDEState *s;
1451
    char *init_group = strlen(group) ? (char *)group : NULL;
1452
    char *init_sock = strlen(sock) ? (char *)sock : NULL;
1453

    
1454
    struct vde_open_args args = {
1455
        .port = port,
1456
        .group = init_group,
1457
        .mode = mode,
1458
    };
1459

    
1460
    s = qemu_mallocz(sizeof(VDEState));
1461
    s->vde = vde_open(init_sock, (char *)"QEMU", &args);
1462
    if (!s->vde){
1463
        free(s);
1464
        return -1;
1465
    }
1466
    s->vc = qemu_new_vlan_client(vlan, model, name, NULL, vde_receive,
1467
                                 NULL, vde_cleanup, s);
1468
    qemu_set_fd_handler(vde_datafd(s->vde), vde_to_qemu, NULL, s);
1469
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), "sock=%s,fd=%d",
1470
             sock, vde_datafd(s->vde));
1471
    return 0;
1472
}
1473
#endif
1474

    
1475
/* network connection */
1476
typedef struct NetSocketState {
1477
    VLANClientState *vc;
1478
    int fd;
1479
    int state; /* 0 = getting length, 1 = getting data */
1480
    unsigned int index;
1481
    unsigned int packet_len;
1482
    uint8_t buf[4096];
1483
    struct sockaddr_in dgram_dst; /* contains inet host and port destination iff connectionless (SOCK_DGRAM) */
1484
} NetSocketState;
1485

    
1486
typedef struct NetSocketListenState {
1487
    VLANState *vlan;
1488
    char *model;
1489
    char *name;
1490
    int fd;
1491
} NetSocketListenState;
1492

    
1493
/* XXX: we consider we can send the whole packet without blocking */
1494
static ssize_t net_socket_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1495
{
1496
    NetSocketState *s = vc->opaque;
1497
    uint32_t len;
1498
    len = htonl(size);
1499

    
1500
    send_all(s->fd, (const uint8_t *)&len, sizeof(len));
1501
    return send_all(s->fd, buf, size);
1502
}
1503

    
1504
static ssize_t net_socket_receive_dgram(VLANClientState *vc, const uint8_t *buf, size_t size)
1505
{
1506
    NetSocketState *s = vc->opaque;
1507

    
1508
    return sendto(s->fd, buf, size, 0,
1509
                  (struct sockaddr *)&s->dgram_dst, sizeof(s->dgram_dst));
1510
}
1511

    
1512
static void net_socket_send(void *opaque)
1513
{
1514
    NetSocketState *s = opaque;
1515
    int size, err;
1516
    unsigned l;
1517
    uint8_t buf1[4096];
1518
    const uint8_t *buf;
1519

    
1520
    size = recv(s->fd, buf1, sizeof(buf1), 0);
1521
    if (size < 0) {
1522
        err = socket_error();
1523
        if (err != EWOULDBLOCK)
1524
            goto eoc;
1525
    } else if (size == 0) {
1526
        /* end of connection */
1527
    eoc:
1528
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1529
        closesocket(s->fd);
1530
        return;
1531
    }
1532
    buf = buf1;
1533
    while (size > 0) {
1534
        /* reassemble a packet from the network */
1535
        switch(s->state) {
1536
        case 0:
1537
            l = 4 - s->index;
1538
            if (l > size)
1539
                l = size;
1540
            memcpy(s->buf + s->index, buf, l);
1541
            buf += l;
1542
            size -= l;
1543
            s->index += l;
1544
            if (s->index == 4) {
1545
                /* got length */
1546
                s->packet_len = ntohl(*(uint32_t *)s->buf);
1547
                s->index = 0;
1548
                s->state = 1;
1549
            }
1550
            break;
1551
        case 1:
1552
            l = s->packet_len - s->index;
1553
            if (l > size)
1554
                l = size;
1555
            if (s->index + l <= sizeof(s->buf)) {
1556
                memcpy(s->buf + s->index, buf, l);
1557
            } else {
1558
                fprintf(stderr, "serious error: oversized packet received,"
1559
                    "connection terminated.\n");
1560
                s->state = 0;
1561
                goto eoc;
1562
            }
1563

    
1564
            s->index += l;
1565
            buf += l;
1566
            size -= l;
1567
            if (s->index >= s->packet_len) {
1568
                qemu_send_packet(s->vc, s->buf, s->packet_len);
1569
                s->index = 0;
1570
                s->state = 0;
1571
            }
1572
            break;
1573
        }
1574
    }
1575
}
1576

    
1577
static void net_socket_send_dgram(void *opaque)
1578
{
1579
    NetSocketState *s = opaque;
1580
    int size;
1581

    
1582
    size = recv(s->fd, s->buf, sizeof(s->buf), 0);
1583
    if (size < 0)
1584
        return;
1585
    if (size == 0) {
1586
        /* end of connection */
1587
        qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1588
        return;
1589
    }
1590
    qemu_send_packet(s->vc, s->buf, size);
1591
}
1592

    
1593
static int net_socket_mcast_create(struct sockaddr_in *mcastaddr)
1594
{
1595
    struct ip_mreq imr;
1596
    int fd;
1597
    int val, ret;
1598
    if (!IN_MULTICAST(ntohl(mcastaddr->sin_addr.s_addr))) {
1599
        fprintf(stderr, "qemu: error: specified mcastaddr \"%s\" (0x%08x) does not contain a multicast address\n",
1600
                inet_ntoa(mcastaddr->sin_addr),
1601
                (int)ntohl(mcastaddr->sin_addr.s_addr));
1602
        return -1;
1603

    
1604
    }
1605
    fd = socket(PF_INET, SOCK_DGRAM, 0);
1606
    if (fd < 0) {
1607
        perror("socket(PF_INET, SOCK_DGRAM)");
1608
        return -1;
1609
    }
1610

    
1611
    val = 1;
1612
    ret=setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
1613
                   (const char *)&val, sizeof(val));
1614
    if (ret < 0) {
1615
        perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
1616
        goto fail;
1617
    }
1618

    
1619
    ret = bind(fd, (struct sockaddr *)mcastaddr, sizeof(*mcastaddr));
1620
    if (ret < 0) {
1621
        perror("bind");
1622
        goto fail;
1623
    }
1624

    
1625
    /* Add host to multicast group */
1626
    imr.imr_multiaddr = mcastaddr->sin_addr;
1627
    imr.imr_interface.s_addr = htonl(INADDR_ANY);
1628

    
1629
    ret = setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP,
1630
                     (const char *)&imr, sizeof(struct ip_mreq));
1631
    if (ret < 0) {
1632
        perror("setsockopt(IP_ADD_MEMBERSHIP)");
1633
        goto fail;
1634
    }
1635

    
1636
    /* Force mcast msgs to loopback (eg. several QEMUs in same host */
1637
    val = 1;
1638
    ret=setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
1639
                   (const char *)&val, sizeof(val));
1640
    if (ret < 0) {
1641
        perror("setsockopt(SOL_IP, IP_MULTICAST_LOOP)");
1642
        goto fail;
1643
    }
1644

    
1645
    socket_set_nonblock(fd);
1646
    return fd;
1647
fail:
1648
    if (fd >= 0)
1649
        closesocket(fd);
1650
    return -1;
1651
}
1652

    
1653
static void net_socket_cleanup(VLANClientState *vc)
1654
{
1655
    NetSocketState *s = vc->opaque;
1656
    qemu_set_fd_handler(s->fd, NULL, NULL, NULL);
1657
    close(s->fd);
1658
    qemu_free(s);
1659
}
1660

    
1661
static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan,
1662
                                                const char *model,
1663
                                                const char *name,
1664
                                                int fd, int is_connected)
1665
{
1666
    struct sockaddr_in saddr;
1667
    int newfd;
1668
    socklen_t saddr_len;
1669
    NetSocketState *s;
1670

    
1671
    /* fd passed: multicast: "learn" dgram_dst address from bound address and save it
1672
     * Because this may be "shared" socket from a "master" process, datagrams would be recv()
1673
     * by ONLY ONE process: we must "clone" this dgram socket --jjo
1674
     */
1675

    
1676
    if (is_connected) {
1677
        if (getsockname(fd, (struct sockaddr *) &saddr, &saddr_len) == 0) {
1678
            /* must be bound */
1679
            if (saddr.sin_addr.s_addr==0) {
1680
                fprintf(stderr, "qemu: error: init_dgram: fd=%d unbound, cannot setup multicast dst addr\n",
1681
                        fd);
1682
                return NULL;
1683
            }
1684
            /* clone dgram socket */
1685
            newfd = net_socket_mcast_create(&saddr);
1686
            if (newfd < 0) {
1687
                /* error already reported by net_socket_mcast_create() */
1688
                close(fd);
1689
                return NULL;
1690
            }
1691
            /* clone newfd to fd, close newfd */
1692
            dup2(newfd, fd);
1693
            close(newfd);
1694

    
1695
        } else {
1696
            fprintf(stderr, "qemu: error: init_dgram: fd=%d failed getsockname(): %s\n",
1697
                    fd, strerror(errno));
1698
            return NULL;
1699
        }
1700
    }
1701

    
1702
    s = qemu_mallocz(sizeof(NetSocketState));
1703
    s->fd = fd;
1704

    
1705
    s->vc = qemu_new_vlan_client(vlan, model, name, NULL, net_socket_receive_dgram,
1706
                                 NULL, net_socket_cleanup, s);
1707
    qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
1708

    
1709
    /* mcast: save bound address as dst */
1710
    if (is_connected) s->dgram_dst=saddr;
1711

    
1712
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1713
            "socket: fd=%d (%s mcast=%s:%d)",
1714
            fd, is_connected? "cloned" : "",
1715
            inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
1716
    return s;
1717
}
1718

    
1719
static void net_socket_connect(void *opaque)
1720
{
1721
    NetSocketState *s = opaque;
1722
    qemu_set_fd_handler(s->fd, net_socket_send, NULL, s);
1723
}
1724

    
1725
static NetSocketState *net_socket_fd_init_stream(VLANState *vlan,
1726
                                                 const char *model,
1727
                                                 const char *name,
1728
                                                 int fd, int is_connected)
1729
{
1730
    NetSocketState *s;
1731
    s = qemu_mallocz(sizeof(NetSocketState));
1732
    s->fd = fd;
1733
    s->vc = qemu_new_vlan_client(vlan, model, name, NULL, net_socket_receive,
1734
                                 NULL, net_socket_cleanup, s);
1735
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1736
             "socket: fd=%d", fd);
1737
    if (is_connected) {
1738
        net_socket_connect(s);
1739
    } else {
1740
        qemu_set_fd_handler(s->fd, NULL, net_socket_connect, s);
1741
    }
1742
    return s;
1743
}
1744

    
1745
static NetSocketState *net_socket_fd_init(VLANState *vlan,
1746
                                          const char *model, const char *name,
1747
                                          int fd, int is_connected)
1748
{
1749
    int so_type=-1, optlen=sizeof(so_type);
1750

    
1751
    if(getsockopt(fd, SOL_SOCKET, SO_TYPE, (char *)&so_type,
1752
        (socklen_t *)&optlen)< 0) {
1753
        fprintf(stderr, "qemu: error: getsockopt(SO_TYPE) for fd=%d failed\n", fd);
1754
        return NULL;
1755
    }
1756
    switch(so_type) {
1757
    case SOCK_DGRAM:
1758
        return net_socket_fd_init_dgram(vlan, model, name, fd, is_connected);
1759
    case SOCK_STREAM:
1760
        return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
1761
    default:
1762
        /* who knows ... this could be a eg. a pty, do warn and continue as stream */
1763
        fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM or SOCK_STREAM\n", so_type, fd);
1764
        return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
1765
    }
1766
    return NULL;
1767
}
1768

    
1769
static void net_socket_accept(void *opaque)
1770
{
1771
    NetSocketListenState *s = opaque;
1772
    NetSocketState *s1;
1773
    struct sockaddr_in saddr;
1774
    socklen_t len;
1775
    int fd;
1776

    
1777
    for(;;) {
1778
        len = sizeof(saddr);
1779
        fd = accept(s->fd, (struct sockaddr *)&saddr, &len);
1780
        if (fd < 0 && errno != EINTR) {
1781
            return;
1782
        } else if (fd >= 0) {
1783
            break;
1784
        }
1785
    }
1786
    s1 = net_socket_fd_init(s->vlan, s->model, s->name, fd, 1);
1787
    if (!s1) {
1788
        closesocket(fd);
1789
    } else {
1790
        snprintf(s1->vc->info_str, sizeof(s1->vc->info_str),
1791
                 "socket: connection from %s:%d",
1792
                 inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
1793
    }
1794
}
1795

    
1796
static int net_socket_listen_init(VLANState *vlan,
1797
                                  const char *model,
1798
                                  const char *name,
1799
                                  const char *host_str)
1800
{
1801
    NetSocketListenState *s;
1802
    int fd, val, ret;
1803
    struct sockaddr_in saddr;
1804

    
1805
    if (parse_host_port(&saddr, host_str) < 0)
1806
        return -1;
1807

    
1808
    s = qemu_mallocz(sizeof(NetSocketListenState));
1809

    
1810
    fd = socket(PF_INET, SOCK_STREAM, 0);
1811
    if (fd < 0) {
1812
        perror("socket");
1813
        return -1;
1814
    }
1815
    socket_set_nonblock(fd);
1816

    
1817
    /* allow fast reuse */
1818
    val = 1;
1819
    setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (const char *)&val, sizeof(val));
1820

    
1821
    ret = bind(fd, (struct sockaddr *)&saddr, sizeof(saddr));
1822
    if (ret < 0) {
1823
        perror("bind");
1824
        return -1;
1825
    }
1826
    ret = listen(fd, 0);
1827
    if (ret < 0) {
1828
        perror("listen");
1829
        return -1;
1830
    }
1831
    s->vlan = vlan;
1832
    s->model = strdup(model);
1833
    s->name = name ? strdup(name) : NULL;
1834
    s->fd = fd;
1835
    qemu_set_fd_handler(fd, net_socket_accept, NULL, s);
1836
    return 0;
1837
}
1838

    
1839
static int net_socket_connect_init(VLANState *vlan,
1840
                                   const char *model,
1841
                                   const char *name,
1842
                                   const char *host_str)
1843
{
1844
    NetSocketState *s;
1845
    int fd, connected, ret, err;
1846
    struct sockaddr_in saddr;
1847

    
1848
    if (parse_host_port(&saddr, host_str) < 0)
1849
        return -1;
1850

    
1851
    fd = socket(PF_INET, SOCK_STREAM, 0);
1852
    if (fd < 0) {
1853
        perror("socket");
1854
        return -1;
1855
    }
1856
    socket_set_nonblock(fd);
1857

    
1858
    connected = 0;
1859
    for(;;) {
1860
        ret = connect(fd, (struct sockaddr *)&saddr, sizeof(saddr));
1861
        if (ret < 0) {
1862
            err = socket_error();
1863
            if (err == EINTR || err == EWOULDBLOCK) {
1864
            } else if (err == EINPROGRESS) {
1865
                break;
1866
#ifdef _WIN32
1867
            } else if (err == WSAEALREADY) {
1868
                break;
1869
#endif
1870
            } else {
1871
                perror("connect");
1872
                closesocket(fd);
1873
                return -1;
1874
            }
1875
        } else {
1876
            connected = 1;
1877
            break;
1878
        }
1879
    }
1880
    s = net_socket_fd_init(vlan, model, name, fd, connected);
1881
    if (!s)
1882
        return -1;
1883
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1884
             "socket: connect to %s:%d",
1885
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
1886
    return 0;
1887
}
1888

    
1889
static int net_socket_mcast_init(VLANState *vlan,
1890
                                 const char *model,
1891
                                 const char *name,
1892
                                 const char *host_str)
1893
{
1894
    NetSocketState *s;
1895
    int fd;
1896
    struct sockaddr_in saddr;
1897

    
1898
    if (parse_host_port(&saddr, host_str) < 0)
1899
        return -1;
1900

    
1901

    
1902
    fd = net_socket_mcast_create(&saddr);
1903
    if (fd < 0)
1904
        return -1;
1905

    
1906
    s = net_socket_fd_init(vlan, model, name, fd, 0);
1907
    if (!s)
1908
        return -1;
1909

    
1910
    s->dgram_dst = saddr;
1911

    
1912
    snprintf(s->vc->info_str, sizeof(s->vc->info_str),
1913
             "socket: mcast=%s:%d",
1914
             inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
1915
    return 0;
1916

    
1917
}
1918

    
1919
typedef struct DumpState {
1920
    VLANClientState *pcap_vc;
1921
    int fd;
1922
    int pcap_caplen;
1923
} DumpState;
1924

    
1925
#define PCAP_MAGIC 0xa1b2c3d4
1926

    
1927
struct pcap_file_hdr {
1928
    uint32_t magic;
1929
    uint16_t version_major;
1930
    uint16_t version_minor;
1931
    int32_t thiszone;
1932
    uint32_t sigfigs;
1933
    uint32_t snaplen;
1934
    uint32_t linktype;
1935
};
1936

    
1937
struct pcap_sf_pkthdr {
1938
    struct {
1939
        int32_t tv_sec;
1940
        int32_t tv_usec;
1941
    } ts;
1942
    uint32_t caplen;
1943
    uint32_t len;
1944
};
1945

    
1946
static ssize_t dump_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
1947
{
1948
    DumpState *s = vc->opaque;
1949
    struct pcap_sf_pkthdr hdr;
1950
    int64_t ts;
1951
    int caplen;
1952

    
1953
    /* Early return in case of previous error. */
1954
    if (s->fd < 0) {
1955
        return size;
1956
    }
1957

    
1958
    ts = muldiv64(qemu_get_clock(vm_clock), 1000000, ticks_per_sec);
1959
    caplen = size > s->pcap_caplen ? s->pcap_caplen : size;
1960

    
1961
    hdr.ts.tv_sec = ts / 1000000;
1962
    hdr.ts.tv_usec = ts % 1000000;
1963
    hdr.caplen = caplen;
1964
    hdr.len = size;
1965
    if (write(s->fd, &hdr, sizeof(hdr)) != sizeof(hdr) ||
1966
        write(s->fd, buf, caplen) != caplen) {
1967
        qemu_log("-net dump write error - stop dump\n");
1968
        close(s->fd);
1969
        s->fd = -1;
1970
    }
1971

    
1972
    return size;
1973
}
1974

    
1975
static void net_dump_cleanup(VLANClientState *vc)
1976
{
1977
    DumpState *s = vc->opaque;
1978

    
1979
    close(s->fd);
1980
    qemu_free(s);
1981
}
1982

    
1983
static int net_dump_init(Monitor *mon, VLANState *vlan, const char *device,
1984
                         const char *name, const char *filename, int len)
1985
{
1986
    struct pcap_file_hdr hdr;
1987
    DumpState *s;
1988

    
1989
    s = qemu_malloc(sizeof(DumpState));
1990

    
1991
    s->fd = open(filename, O_CREAT | O_WRONLY, 0644);
1992
    if (s->fd < 0) {
1993
        config_error(mon, "-net dump: can't open %s\n", filename);
1994
        return -1;
1995
    }
1996

    
1997
    s->pcap_caplen = len;
1998

    
1999
    hdr.magic = PCAP_MAGIC;
2000
    hdr.version_major = 2;
2001
    hdr.version_minor = 4;
2002
    hdr.thiszone = 0;
2003
    hdr.sigfigs = 0;
2004
    hdr.snaplen = s->pcap_caplen;
2005
    hdr.linktype = 1;
2006

    
2007
    if (write(s->fd, &hdr, sizeof(hdr)) < sizeof(hdr)) {
2008
        config_error(mon, "-net dump write error: %s\n", strerror(errno));
2009
        close(s->fd);
2010
        qemu_free(s);
2011
        return -1;
2012
    }
2013

    
2014
    s->pcap_vc = qemu_new_vlan_client(vlan, device, name, NULL, dump_receive, NULL,
2015
                                      net_dump_cleanup, s);
2016
    snprintf(s->pcap_vc->info_str, sizeof(s->pcap_vc->info_str),
2017
             "dump to %s (len=%d)", filename, len);
2018
    return 0;
2019
}
2020

    
2021
/* find or alloc a new VLAN */
2022
VLANState *qemu_find_vlan(int id)
2023
{
2024
    VLANState **pvlan, *vlan;
2025
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
2026
        if (vlan->id == id)
2027
            return vlan;
2028
    }
2029
    vlan = qemu_mallocz(sizeof(VLANState));
2030
    vlan->id = id;
2031
    vlan->next = NULL;
2032
    pvlan = &first_vlan;
2033
    while (*pvlan != NULL)
2034
        pvlan = &(*pvlan)->next;
2035
    *pvlan = vlan;
2036
    return vlan;
2037
}
2038

    
2039
static int nic_get_free_idx(void)
2040
{
2041
    int index;
2042

    
2043
    for (index = 0; index < MAX_NICS; index++)
2044
        if (!nd_table[index].used)
2045
            return index;
2046
    return -1;
2047
}
2048

    
2049
void qemu_check_nic_model(NICInfo *nd, const char *model)
2050
{
2051
    const char *models[2];
2052

    
2053
    models[0] = model;
2054
    models[1] = NULL;
2055

    
2056
    qemu_check_nic_model_list(nd, models, model);
2057
}
2058

    
2059
void qemu_check_nic_model_list(NICInfo *nd, const char * const *models,
2060
                               const char *default_model)
2061
{
2062
    int i, exit_status = 0;
2063

    
2064
    if (!nd->model)
2065
        nd->model = strdup(default_model);
2066

    
2067
    if (strcmp(nd->model, "?") != 0) {
2068
        for (i = 0 ; models[i]; i++)
2069
            if (strcmp(nd->model, models[i]) == 0)
2070
                return;
2071

    
2072
        fprintf(stderr, "qemu: Unsupported NIC model: %s\n", nd->model);
2073
        exit_status = 1;
2074
    }
2075

    
2076
    fprintf(stderr, "qemu: Supported NIC models: ");
2077
    for (i = 0 ; models[i]; i++)
2078
        fprintf(stderr, "%s%c", models[i], models[i+1] ? ',' : '\n');
2079

    
2080
    exit(exit_status);
2081
}
2082

    
2083
int net_client_init(Monitor *mon, const char *device, const char *p)
2084
{
2085
    static const char * const fd_params[] = {
2086
        "vlan", "name", "fd", NULL
2087
    };
2088
    char buf[1024];
2089
    int vlan_id, ret;
2090
    VLANState *vlan;
2091
    char *name = NULL;
2092

    
2093
    vlan_id = 0;
2094
    if (get_param_value(buf, sizeof(buf), "vlan", p)) {
2095
        vlan_id = strtol(buf, NULL, 0);
2096
    }
2097
    vlan = qemu_find_vlan(vlan_id);
2098

    
2099
    if (get_param_value(buf, sizeof(buf), "name", p)) {
2100
        name = qemu_strdup(buf);
2101
    }
2102
    if (!strcmp(device, "nic")) {
2103
        static const char * const nic_params[] = {
2104
            "vlan", "name", "macaddr", "model", NULL
2105
        };
2106
        NICInfo *nd;
2107
        uint8_t *macaddr;
2108
        int idx = nic_get_free_idx();
2109

    
2110
        if (check_params(buf, sizeof(buf), nic_params, p) < 0) {
2111
            config_error(mon, "invalid parameter '%s' in '%s'\n", buf, p);
2112
            ret = -1;
2113
            goto out;
2114
        }
2115
        if (idx == -1 || nb_nics >= MAX_NICS) {
2116
            config_error(mon, "Too Many NICs\n");
2117
            ret = -1;
2118
            goto out;
2119
        }
2120
        nd = &nd_table[idx];
2121
        macaddr = nd->macaddr;
2122
        macaddr[0] = 0x52;
2123
        macaddr[1] = 0x54;
2124
        macaddr[2] = 0x00;
2125
        macaddr[3] = 0x12;
2126
        macaddr[4] = 0x34;
2127
        macaddr[5] = 0x56 + idx;
2128

    
2129
        if (get_param_value(buf, sizeof(buf), "macaddr", p)) {
2130
            if (parse_macaddr(macaddr, buf) < 0) {
2131
                config_error(mon, "invalid syntax for ethernet address\n");
2132
                ret = -1;
2133
                goto out;
2134
            }
2135
        }
2136
        if (get_param_value(buf, sizeof(buf), "model", p)) {
2137
            nd->model = strdup(buf);
2138
        }
2139
        nd->vlan = vlan;
2140
        nd->name = name;
2141
        nd->used = 1;
2142
        name = NULL;
2143
        nb_nics++;
2144
        vlan->nb_guest_devs++;
2145
        ret = idx;
2146
    } else
2147
    if (!strcmp(device, "none")) {
2148
        if (*p != '\0') {
2149
            config_error(mon, "'none' takes no parameters\n");
2150
            ret = -1;
2151
            goto out;
2152
        }
2153
        /* does nothing. It is needed to signal that no network cards
2154
           are wanted */
2155
        ret = 0;
2156
    } else
2157
#ifdef CONFIG_SLIRP
2158
    if (!strcmp(device, "user")) {
2159
        static const char * const slirp_params[] = {
2160
            "vlan", "name", "hostname", "restrict", "ip", NULL
2161
        };
2162
        int restricted = 0;
2163
        char *ip = NULL;
2164

    
2165
        if (check_params(buf, sizeof(buf), slirp_params, p) < 0) {
2166
            config_error(mon, "invalid parameter '%s' in '%s'\n", buf, p);
2167
            ret = -1;
2168
            goto out;
2169
        }
2170
        if (get_param_value(buf, sizeof(buf), "hostname", p)) {
2171
            pstrcpy(slirp_hostname, sizeof(slirp_hostname), buf);
2172
        }
2173
        if (get_param_value(buf, sizeof(buf), "restrict", p)) {
2174
            restricted = (buf[0] == 'y') ? 1 : 0;
2175
        }
2176
        if (get_param_value(buf, sizeof(buf), "ip", p)) {
2177
            ip = qemu_strdup(buf);
2178
        }
2179
        vlan->nb_host_devs++;
2180
        ret = net_slirp_init(vlan, device, name, restricted, ip);
2181
        qemu_free(ip);
2182
    } else if (!strcmp(device, "channel")) {
2183
        long port;
2184
        char name[20], *devname;
2185
        struct VMChannel *vmc;
2186

    
2187
        port = strtol(p, &devname, 10);
2188
        devname++;
2189
        if (port < 1 || port > 65535) {
2190
            config_error(mon, "vmchannel wrong port number\n");
2191
            ret = -1;
2192
            goto out;
2193
        }
2194
        vmc = malloc(sizeof(struct VMChannel));
2195
        snprintf(name, 20, "vmchannel%ld", port);
2196
        vmc->hd = qemu_chr_open(name, devname, NULL);
2197
        if (!vmc->hd) {
2198
            config_error(mon, "could not open vmchannel device '%s'\n",
2199
                         devname);
2200
            ret = -1;
2201
            goto out;
2202
        }
2203
        vmc->port = port;
2204
        slirp_add_exec(3, vmc->hd, 4, port);
2205
        qemu_chr_add_handlers(vmc->hd, vmchannel_can_read, vmchannel_read,
2206
                NULL, vmc);
2207
        ret = 0;
2208
    } else
2209
#endif
2210
#ifdef _WIN32
2211
    if (!strcmp(device, "tap")) {
2212
        static const char * const tap_params[] = {
2213
            "vlan", "name", "ifname", NULL
2214
        };
2215
        char ifname[64];
2216

    
2217
        if (check_params(buf, sizeof(buf), tap_params, p) < 0) {
2218
            config_error(mon, "invalid parameter '%s' in '%s'\n", buf, p);
2219
            ret = -1;
2220
            goto out;
2221
        }
2222
        if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
2223
            config_error(mon, "tap: no interface name\n");
2224
            ret = -1;
2225
            goto out;
2226
        }
2227
        vlan->nb_host_devs++;
2228
        ret = tap_win32_init(vlan, device, name, ifname);
2229
    } else
2230
#elif defined (_AIX)
2231
#else
2232
    if (!strcmp(device, "tap")) {
2233
        char ifname[64], chkbuf[64];
2234
        char setup_script[1024], down_script[1024];
2235
        int fd;
2236
        vlan->nb_host_devs++;
2237
        if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
2238
            if (check_params(chkbuf, sizeof(chkbuf), fd_params, p) < 0) {
2239
                config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2240
                ret = -1;
2241
                goto out;
2242
            }
2243
            fd = strtol(buf, NULL, 0);
2244
            fcntl(fd, F_SETFL, O_NONBLOCK);
2245
            net_tap_fd_init(vlan, device, name, fd);
2246
            ret = 0;
2247
        } else {
2248
            static const char * const tap_params[] = {
2249
                "vlan", "name", "ifname", "script", "downscript", NULL
2250
            };
2251
            if (check_params(chkbuf, sizeof(chkbuf), tap_params, p) < 0) {
2252
                config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2253
                ret = -1;
2254
                goto out;
2255
            }
2256
            if (get_param_value(ifname, sizeof(ifname), "ifname", p) <= 0) {
2257
                ifname[0] = '\0';
2258
            }
2259
            if (get_param_value(setup_script, sizeof(setup_script), "script", p) == 0) {
2260
                pstrcpy(setup_script, sizeof(setup_script), DEFAULT_NETWORK_SCRIPT);
2261
            }
2262
            if (get_param_value(down_script, sizeof(down_script), "downscript", p) == 0) {
2263
                pstrcpy(down_script, sizeof(down_script), DEFAULT_NETWORK_DOWN_SCRIPT);
2264
            }
2265
            ret = net_tap_init(vlan, device, name, ifname, setup_script, down_script);
2266
        }
2267
    } else
2268
#endif
2269
    if (!strcmp(device, "socket")) {
2270
        char chkbuf[64];
2271
        if (get_param_value(buf, sizeof(buf), "fd", p) > 0) {
2272
            int fd;
2273
            if (check_params(chkbuf, sizeof(chkbuf), fd_params, p) < 0) {
2274
                config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2275
                ret = -1;
2276
                goto out;
2277
            }
2278
            fd = strtol(buf, NULL, 0);
2279
            ret = -1;
2280
            if (net_socket_fd_init(vlan, device, name, fd, 1))
2281
                ret = 0;
2282
        } else if (get_param_value(buf, sizeof(buf), "listen", p) > 0) {
2283
            static const char * const listen_params[] = {
2284
                "vlan", "name", "listen", NULL
2285
            };
2286
            if (check_params(chkbuf, sizeof(chkbuf), listen_params, p) < 0) {
2287
                config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2288
                ret = -1;
2289
                goto out;
2290
            }
2291
            ret = net_socket_listen_init(vlan, device, name, buf);
2292
        } else if (get_param_value(buf, sizeof(buf), "connect", p) > 0) {
2293
            static const char * const connect_params[] = {
2294
                "vlan", "name", "connect", NULL
2295
            };
2296
            if (check_params(chkbuf, sizeof(chkbuf), connect_params, p) < 0) {
2297
                config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2298
                ret = -1;
2299
                goto out;
2300
            }
2301
            ret = net_socket_connect_init(vlan, device, name, buf);
2302
        } else if (get_param_value(buf, sizeof(buf), "mcast", p) > 0) {
2303
            static const char * const mcast_params[] = {
2304
                "vlan", "name", "mcast", NULL
2305
            };
2306
            if (check_params(chkbuf, sizeof(chkbuf), mcast_params, p) < 0) {
2307
                config_error(mon, "invalid parameter '%s' in '%s'\n", chkbuf, p);
2308
                ret = -1;
2309
                goto out;
2310
            }
2311
            ret = net_socket_mcast_init(vlan, device, name, buf);
2312
        } else {
2313
            config_error(mon, "Unknown socket options: %s\n", p);
2314
            ret = -1;
2315
            goto out;
2316
        }
2317
        vlan->nb_host_devs++;
2318
    } else
2319
#ifdef CONFIG_VDE
2320
    if (!strcmp(device, "vde")) {
2321
        static const char * const vde_params[] = {
2322
            "vlan", "name", "sock", "port", "group", "mode", NULL
2323
        };
2324
        char vde_sock[1024], vde_group[512];
2325
        int vde_port, vde_mode;
2326

    
2327
        if (check_params(buf, sizeof(buf), vde_params, p) < 0) {
2328
            config_error(mon, "invalid parameter '%s' in '%s'\n", buf, p);
2329
            ret = -1;
2330
            goto out;
2331
        }
2332
        vlan->nb_host_devs++;
2333
        if (get_param_value(vde_sock, sizeof(vde_sock), "sock", p) <= 0) {
2334
            vde_sock[0] = '\0';
2335
        }
2336
        if (get_param_value(buf, sizeof(buf), "port", p) > 0) {
2337
            vde_port = strtol(buf, NULL, 10);
2338
        } else {
2339
            vde_port = 0;
2340
        }
2341
        if (get_param_value(vde_group, sizeof(vde_group), "group", p) <= 0) {
2342
            vde_group[0] = '\0';
2343
        }
2344
        if (get_param_value(buf, sizeof(buf), "mode", p) > 0) {
2345
            vde_mode = strtol(buf, NULL, 8);
2346
        } else {
2347
            vde_mode = 0700;
2348
        }
2349
        ret = net_vde_init(vlan, device, name, vde_sock, vde_port, vde_group, vde_mode);
2350
    } else
2351
#endif
2352
    if (!strcmp(device, "dump")) {
2353
        int len = 65536;
2354

    
2355
        if (get_param_value(buf, sizeof(buf), "len", p) > 0) {
2356
            len = strtol(buf, NULL, 0);
2357
        }
2358
        if (!get_param_value(buf, sizeof(buf), "file", p)) {
2359
            snprintf(buf, sizeof(buf), "qemu-vlan%d.pcap", vlan_id);
2360
        }
2361
        ret = net_dump_init(mon, vlan, device, name, buf, len);
2362
    } else {
2363
        config_error(mon, "Unknown network device: %s\n", device);
2364
        ret = -1;
2365
        goto out;
2366
    }
2367
    if (ret < 0) {
2368
        config_error(mon, "Could not initialize device '%s'\n", device);
2369
    }
2370
out:
2371
    qemu_free(name);
2372
    return ret;
2373
}
2374

    
2375
void net_client_uninit(NICInfo *nd)
2376
{
2377
    nd->vlan->nb_guest_devs--;
2378
    nb_nics--;
2379
    nd->used = 0;
2380
    free((void *)nd->model);
2381
}
2382

    
2383
static int net_host_check_device(const char *device)
2384
{
2385
    int i;
2386
    const char *valid_param_list[] = { "tap", "socket", "dump"
2387
#ifdef CONFIG_SLIRP
2388
                                       ,"user"
2389
#endif
2390
#ifdef CONFIG_VDE
2391
                                       ,"vde"
2392
#endif
2393
    };
2394
    for (i = 0; i < sizeof(valid_param_list) / sizeof(char *); i++) {
2395
        if (!strncmp(valid_param_list[i], device,
2396
                     strlen(valid_param_list[i])))
2397
            return 1;
2398
    }
2399

    
2400
    return 0;
2401
}
2402

    
2403
void net_host_device_add(Monitor *mon, const char *device, const char *opts)
2404
{
2405
    if (!net_host_check_device(device)) {
2406
        monitor_printf(mon, "invalid host network device %s\n", device);
2407
        return;
2408
    }
2409
    if (net_client_init(mon, device, opts ? opts : "") < 0) {
2410
        monitor_printf(mon, "adding host network device %s failed\n", device);
2411
    }
2412
}
2413

    
2414
void net_host_device_remove(Monitor *mon, int vlan_id, const char *device)
2415
{
2416
    VLANState *vlan;
2417
    VLANClientState *vc;
2418

    
2419
    vlan = qemu_find_vlan(vlan_id);
2420

    
2421
    for (vc = vlan->first_client; vc != NULL; vc = vc->next) {
2422
        if (!strcmp(vc->name, device)) {
2423
            break;
2424
        }
2425
    }
2426

    
2427
    if (!vc) {
2428
        monitor_printf(mon, "can't find device %s\n", device);
2429
        return;
2430
    }
2431
    if (!net_host_check_device(vc->model)) {
2432
        monitor_printf(mon, "invalid host network device %s\n", device);
2433
        return;
2434
    }
2435
    qemu_del_vlan_client(vc);
2436
}
2437

    
2438
int net_client_parse(const char *str)
2439
{
2440
    const char *p;
2441
    char *q;
2442
    char device[64];
2443

    
2444
    p = str;
2445
    q = device;
2446
    while (*p != '\0' && *p != ',') {
2447
        if ((q - device) < sizeof(device) - 1)
2448
            *q++ = *p;
2449
        p++;
2450
    }
2451
    *q = '\0';
2452
    if (*p == ',')
2453
        p++;
2454

    
2455
    return net_client_init(NULL, device, p);
2456
}
2457

    
2458
void do_info_network(Monitor *mon)
2459
{
2460
    VLANState *vlan;
2461
    VLANClientState *vc;
2462

    
2463
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
2464
        monitor_printf(mon, "VLAN %d devices:\n", vlan->id);
2465
        for(vc = vlan->first_client; vc != NULL; vc = vc->next)
2466
            monitor_printf(mon, "  %s: %s\n", vc->name, vc->info_str);
2467
    }
2468
}
2469

    
2470
int do_set_link(Monitor *mon, const char *name, const char *up_or_down)
2471
{
2472
    VLANState *vlan;
2473
    VLANClientState *vc = NULL;
2474

    
2475
    for (vlan = first_vlan; vlan != NULL; vlan = vlan->next)
2476
        for (vc = vlan->first_client; vc != NULL; vc = vc->next)
2477
            if (strcmp(vc->name, name) == 0)
2478
                goto done;
2479
done:
2480

    
2481
    if (!vc) {
2482
        monitor_printf(mon, "could not find network device '%s'", name);
2483
        return 0;
2484
    }
2485

    
2486
    if (strcmp(up_or_down, "up") == 0)
2487
        vc->link_down = 0;
2488
    else if (strcmp(up_or_down, "down") == 0)
2489
        vc->link_down = 1;
2490
    else
2491
        monitor_printf(mon, "invalid link status '%s'; only 'up' or 'down' "
2492
                       "valid\n", up_or_down);
2493

    
2494
    if (vc->link_status_changed)
2495
        vc->link_status_changed(vc);
2496

    
2497
    return 1;
2498
}
2499

    
2500
void net_cleanup(void)
2501
{
2502
    VLANState *vlan;
2503

    
2504
    /* close network clients */
2505
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
2506
        VLANClientState *vc = vlan->first_client;
2507

    
2508
        while (vc) {
2509
            VLANClientState *next = vc->next;
2510

    
2511
            qemu_del_vlan_client(vc);
2512

    
2513
            vc = next;
2514
        }
2515
    }
2516
}
2517

    
2518
void net_client_check(void)
2519
{
2520
    VLANState *vlan;
2521

    
2522
    for(vlan = first_vlan; vlan != NULL; vlan = vlan->next) {
2523
        if (vlan->nb_guest_devs == 0 && vlan->nb_host_devs == 0)
2524
            continue;
2525
        if (vlan->nb_guest_devs == 0)
2526
            fprintf(stderr, "Warning: vlan %d with no nics\n", vlan->id);
2527
        if (vlan->nb_host_devs == 0)
2528
            fprintf(stderr,
2529
                    "Warning: vlan %d is not connected to host network\n",
2530
                    vlan->id);
2531
    }
2532
}