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