qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [4896] Add Virtual Distributed Ethernet native support, by


From: Thiemo Seufer
Subject: [Qemu-devel] [4896] Add Virtual Distributed Ethernet native support, by Luca Bigliardi.
Date: Sat, 19 Jul 2008 09:56:25 +0000

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 <libvdeplug.h>
+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
 
address@hidden -net 
vde[,address@hidden,address@hidden,address@hidden,address@hidden,address@hidden
+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:
address@hidden
+# launch vde switch
+vde_switch -F -sock /tmp/myswitch
+# launch QEMU instance
+qemu linux.img -net nic -net vde,sock=/tmp/myswitch
address@hidden 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 <libvdeplug.h>
+#endif
+
 #ifdef _WIN32
 #include <malloc.h>
 #include <sys/timeb.h>
@@ -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






reply via email to

[Prev in Thread] Current Thread [Next in Thread]