Revision 5c361cc3 net.c

b/net.c
86 86
#include <util.h>
87 87
#endif
88 88

  
89
#if defined(CONFIG_VDE)
90
#include <libvdeplug.h>
91
#endif
92

  
93 89
#include "qemu-common.h"
94 90
#include "net.h"
95 91
#include "net/tap.h"
96 92
#include "net/slirp.h"
93
#include "net/vde.h"
97 94
#include "monitor.h"
98 95
#include "sysemu.h"
99 96
#include "qemu-timer.h"
......
719 716
    return qemu_sendv_packet_async(vc, iov, iovcnt, NULL);
720 717
}
721 718

  
722
#if defined(CONFIG_VDE)
723
typedef struct VDEState {
724
    VLANClientState *vc;
725
    VDECONN *vde;
726
} VDEState;
727

  
728
static void vde_to_qemu(void *opaque)
729
{
730
    VDEState *s = opaque;
731
    uint8_t buf[4096];
732
    int size;
733

  
734
    size = vde_recv(s->vde, (char *)buf, sizeof(buf), 0);
735
    if (size > 0) {
736
        qemu_send_packet(s->vc, buf, size);
737
    }
738
}
739

  
740
static ssize_t vde_receive(VLANClientState *vc, const uint8_t *buf, size_t size)
741
{
742
    VDEState *s = vc->opaque;
743
    ssize_t ret;
744

  
745
    do {
746
      ret = vde_send(s->vde, (const char *)buf, size, 0);
747
    } while (ret < 0 && errno == EINTR);
748

  
749
    return ret;
750
}
751

  
752
static void vde_cleanup(VLANClientState *vc)
753
{
754
    VDEState *s = vc->opaque;
755
    qemu_set_fd_handler(vde_datafd(s->vde), NULL, NULL, NULL);
756
    vde_close(s->vde);
757
    qemu_free(s);
758
}
759

  
760
static int net_vde_init(VLANState *vlan, const char *model,
761
                        const char *name, const char *sock,
762
                        int port, const char *group, int mode)
763
{
764
    VDEState *s;
765
    char *init_group = (char *)group;
766
    char *init_sock = (char *)sock;
767

  
768
    struct vde_open_args args = {
769
        .port = port,
770
        .group = init_group,
771
        .mode = mode,
772
    };
773

  
774
    s = qemu_mallocz(sizeof(VDEState));
775
    s->vde = vde_open(init_sock, (char *)"QEMU", &args);
776
    if (!s->vde){
777
        free(s);
778
        return -1;
779
    }
780
    s->vc = qemu_new_vlan_client(NET_CLIENT_TYPE_VDE,
781
                                 vlan, NULL, model, name, NULL,
782
                                 vde_receive, NULL, NULL,
783
                                 vde_cleanup, s);
784
    qemu_set_fd_handler(vde_datafd(s->vde), vde_to_qemu, NULL, s);
785
    snprintf(s->vc->info_str, sizeof(s->vc->info_str), "sock=%s,fd=%d",
786
             sock, vde_datafd(s->vde));
787
    return 0;
788
}
789
#endif
790

  
791 719
/* network connection */
792 720
typedef struct NetSocketState {
793 721
    VLANClientState *vc;
......
1600 1528
    return 0;
1601 1529
}
1602 1530

  
1603
#ifdef CONFIG_VDE
1604
static int net_init_vde(QemuOpts *opts,
1605
                        Monitor *mon,
1606
                        const char *name,
1607
                        VLANState *vlan)
1608
{
1609
    const char *sock;
1610
    const char *group;
1611
    int port, mode;
1612

  
1613
    sock  = qemu_opt_get(opts, "sock");
1614
    group = qemu_opt_get(opts, "group");
1615

  
1616
    port = qemu_opt_get_number(opts, "port", 0);
1617
    mode = qemu_opt_get_number(opts, "mode", 0700);
1618

  
1619
    if (net_vde_init(vlan, "vde", name, sock, port, group, mode) == -1) {
1620
        return -1;
1621
    }
1622

  
1623
    if (vlan) {
1624
        vlan->nb_host_devs++;
1625
    }
1626

  
1627
    return 0;
1628
}
1629
#endif
1630

  
1631 1531
static int net_init_dump(QemuOpts *opts,
1632 1532
                         Monitor *mon,
1633 1533
                         const char *name,

Also available in: Unified diff