From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KK9Az-0005gO-GI for qemu-devel@nongnu.org; Sat, 19 Jul 2008 05:56:29 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KK9Ay-0005dV-LH for qemu-devel@nongnu.org; Sat, 19 Jul 2008 05:56:28 -0400 Received: from [199.232.76.173] (port=46897 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KK9Ax-0005cu-T2 for qemu-devel@nongnu.org; Sat, 19 Jul 2008 05:56:27 -0400 Received: from savannah.gnu.org ([199.232.41.3]:53825 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KK9Ax-0003Xh-IM for qemu-devel@nongnu.org; Sat, 19 Jul 2008 05:56:27 -0400 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1KK9Av-0007oG-RJ for qemu-devel@nongnu.org; Sat, 19 Jul 2008 09:56:26 +0000 Received: from ths by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1KK9Av-0007o3-5Q for qemu-devel@nongnu.org; Sat, 19 Jul 2008 09:56:25 +0000 MIME-Version: 1.0 Errors-To: ths Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Thiemo Seufer Message-Id: Date: Sat, 19 Jul 2008 09:56:25 +0000 Subject: [Qemu-devel] [4896] Add Virtual Distributed Ethernet native support, by Luca Bigliardi. Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 4896 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=4896 Author: ths Date: 2008-07-19 09:56:24 +0000 (Sat, 19 Jul 2008) Log Message: ----------- Add Virtual Distributed Ethernet native support, by Luca Bigliardi. Modified Paths: -------------- trunk/Makefile trunk/Makefile.target trunk/configure trunk/qemu-doc.texi trunk/vl.c Modified: trunk/Makefile =================================================================== --- trunk/Makefile 2008-07-19 09:38:52 UTC (rev 4895) +++ trunk/Makefile 2008-07-19 09:56:24 UTC (rev 4896) @@ -133,6 +133,8 @@ OBJS+=$(addprefix slirp/, $(SLIRP_OBJS)) endif +LIBS+=$(VDE_LIBS) + cocoa.o: cocoa.m $(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $< Modified: trunk/Makefile.target =================================================================== --- trunk/Makefile.target 2008-07-19 09:38:52 UTC (rev 4895) +++ trunk/Makefile.target 2008-07-19 09:56:24 UTC (rev 4896) @@ -655,7 +655,7 @@ endif $(QEMU_PROG): $(OBJS) ../libqemu_common.a libqemu.a - $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) $(SDL_LIBS) $(COCOA_LIBS) $(CURSES_LIBS) $(BRLAPI_LIBS) + $(CC) $(LDFLAGS) -o $@ $^ $(LIBS) $(SDL_LIBS) $(COCOA_LIBS) $(CURSES_LIBS) $(BRLAPI_LIBS) $(VDE_LIBS) endif # !CONFIG_USER_ONLY Modified: trunk/configure =================================================================== --- trunk/configure 2008-07-19 09:38:52 UTC (rev 4895) +++ trunk/configure 2008-07-19 09:56:24 UTC (rev 4896) @@ -89,6 +89,7 @@ EXESUF="" gdbstub="yes" slirp="yes" +vde="no" fmod_lib="" fmod_inc="" vnc_tls="yes" @@ -280,6 +281,8 @@ ;; --disable-slirp) slirp="no" ;; + --enable-vde) vde="yes" + ;; --disable-kqemu) kqemu="no" ;; --disable-brlapi) brlapi="no" @@ -432,6 +435,7 @@ echo " --fmod-inc path to FMOD includes" echo " --enable-uname-release=R Return R for uname -r in usermode emulation" echo " --sparc_cpu=V Build qemu for Sparc architecture v7, v8, v8plus, v8plusa, v9" +echo " --enable-vde enable support for vde network [$vde]" echo "" echo "NOTE: The object files are built at the place where configure is launched" exit 1 @@ -722,6 +726,24 @@ fi ########################################## +# vde libraries probe +if test "$vde" = "yes" ; then + cat > $TMPC << EOF +#include +int main(void) { struct vde_open_args a = {0, 0, 0} ; return 0;} +EOF + if $cc $ARCH_CFLAGS -o $TMPE $TMPC 2> /dev/null ; then + : + else + echo + echo "Error: VDE check failed" + echo "Make sure to have the VDE libs and headers installed." + echo + exit 1 + fi +fi + +########################################## # Sound support libraries probe audio_drv_probe() @@ -874,6 +896,7 @@ [ ! -z "$uname_release" ] && \ echo "uname -r $uname_release" echo "NPTL support $nptl" +echo "vde support $vde" if test $sdl_too_old = "yes"; then echo "-> Your SDL version is too old - please upgrade to have SDL support" @@ -1038,6 +1061,11 @@ echo "CONFIG_SLIRP=yes" >> $config_mak echo "#define CONFIG_SLIRP 1" >> $config_h fi +if test "$vde" = "yes" ; then + echo "CONFIG_VDE=yes" >> $config_mak + echo "#define CONFIG_VDE 1" >> $config_h + echo "VDE_LIBS=-lvdeplug" >> $config_mak +fi for card in $audio_card_list; do def=CONFIG_`echo $card | tr '[:lower:]' '[:upper:]'` echo "$def=yes" >> $config_mak Modified: trunk/qemu-doc.texi =================================================================== --- trunk/qemu-doc.texi 2008-07-19 09:38:52 UTC (rev 4895) +++ trunk/qemu-doc.texi 2008-07-19 09:56:24 UTC (rev 4896) @@ -675,6 +675,21 @@ /path/to/linux ubd0=/path/to/root_fs eth0=mcast @end example +@item -net vde[,vlan=@var{n}][,sock=@var{socketpath}][,port=@var{n}][,group=@var{groupname}][,mode=@var{octalmode}] +Connect VLAN @var{n} to PORT @var{n} of a vde switch running on host and +listening for incoming connections on @var{socketpath}. Use GROUP @var{groupname} +and MODE @var{octalmode} to change default ownership and permissions for +communication port. This option is available only if QEMU has been compiled +with vde support enabled. + +Example: +@example +# launch vde switch +vde_switch -F -sock /tmp/myswitch +# launch QEMU instance +qemu linux.img -net nic -net vde,sock=/tmp/myswitch +@end example + @item -net none Indicate that no network devices should be configured. It is used to override the default configuration (@option{-net nic -net user}) which Modified: trunk/vl.c =================================================================== --- trunk/vl.c 2008-07-19 09:38:52 UTC (rev 4895) +++ trunk/vl.c 2008-07-19 09:56:24 UTC (rev 4896) @@ -106,6 +106,10 @@ #include "libslirp.h" #endif +#if defined(CONFIG_VDE) +#include +#endif + #ifdef _WIN32 #include #include @@ -4418,6 +4422,66 @@ #endif /* !_WIN32 */ +#if defined(CONFIG_VDE) +typedef struct VDEState { + VLANClientState *vc; + VDECONN *vde; +} VDEState; + +static void vde_to_qemu(void *opaque) +{ + VDEState *s = opaque; + uint8_t buf[4096]; + int size; + + size = vde_recv(s->vde, buf, sizeof(buf), 0); + if (size > 0) { + qemu_send_packet(s->vc, buf, size); + } +} + +static void vde_from_qemu(void *opaque, const uint8_t *buf, int size) +{ + VDEState *s = opaque; + int ret; + for(;;) { + ret = vde_send(s->vde, buf, size, 0); + if (ret < 0 && errno == EINTR) { + } else { + break; + } + } +} + +static int net_vde_init(VLANState *vlan, const char *sock, int port, + const char *group, int mode) +{ + VDEState *s; + char *init_group = strlen(group) ? (char *)group : NULL; + char *init_sock = strlen(sock) ? (char *)sock : NULL; + + struct vde_open_args args = { + .port = port, + .group = init_group, + .mode = mode, + }; + + s = qemu_mallocz(sizeof(VDEState)); + if (!s) + return -1; + s->vde = vde_open(init_sock, "QEMU", &args); + if (!s->vde){ + free(s); + return -1; + } + s->vc = qemu_new_vlan_client(vlan, vde_from_qemu, NULL, s); + qemu_set_fd_handler(vde_datafd(s->vde), vde_to_qemu, NULL, s); + snprintf(s->vc->info_str, sizeof(s->vc->info_str), "vde: sock=%s fd=%d", + sock, vde_datafd(s->vde)); + return 0; +} +#endif + /* network connection */ typedef struct NetSocketState { VLANClientState *vc; @@ -5047,6 +5111,30 @@ } vlan->nb_host_devs++; } else +#ifdef CONFIG_VDE + if (!strcmp(device, "vde")) { + char vde_sock[1024], vde_group[512]; + int vde_port, vde_mode; + vlan->nb_host_devs++; + if (get_param_value(vde_sock, sizeof(vde_sock), "sock", p) <= 0) { + vde_sock[0] = '\0'; + } + if (get_param_value(buf, sizeof(buf), "port", p) > 0) { + vde_port = strtol(buf, NULL, 10); + } else { + vde_port = 0; + } + if (get_param_value(vde_group, sizeof(vde_group), "group", p) <= 0) { + vde_group[0] = '\0'; + } + if (get_param_value(buf, sizeof(buf), "mode", p) > 0) { + vde_mode = strtol(buf, NULL, 8); + } else { + vde_mode = 0700; + } + ret = net_vde_init(vlan, vde_sock, vde_port, vde_group, vde_mode); + } else +#endif { fprintf(stderr, "Unknown network device: %s\n", device); return -1; @@ -7418,6 +7506,13 @@ " connect the vlan 'n' to another VLAN using a socket connection\n" "-net socket[,vlan=n][,fd=h][,mcast=maddr:port]\n" " connect the vlan 'n' to multicast maddr and port\n" +#ifdef CONFIG_VDE + "-net vde[,vlan=n][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode]\n" + " connect the vlan 'n' to port 'n' of a vde switch running\n" + " on host and listening for incoming connections on 'socketpath'.\n" + " Use group 'groupname' and mode 'octalmode' to change default\n" + " ownership and permissions for communication port.\n" +#endif "-net none use it alone to have zero network devices; if no -net option\n" " is provided, the default is '-net nic -net user'\n" "\n" @@ -8907,6 +9002,12 @@ s->down_script[0]) launch_script(s->down_script, ifname, s->fd); } +#if defined(CONFIG_VDE) + if (vc->fd_read == vde_from_qemu) { + VDEState *s = vc->opaque; + vde_close(s->vde); + } +#endif } } #endif