vde network backend
RFC PATCH 1/1 vde network backend
Hi,
I've written a new network backend for user-mode-linux using libvdeplug to connect to a vde_switch. In the following lines I've made a little description of what VDE is and I've written a couple of examples to give you an idea of the benefits you can have using this backend.
Please tell me what do you think about vde-transport and its first implementation I'm attaching in this mail (It's a patch developed on 2.6.22.1 vanilla).
Transport syntax:
ethN=vde,<vde_switch>,<mac addr>,<port>,<group>,<mode>,<description>
Simplest example (attach to default switch on first port available):
eth0=vde
Virtual Distributed Ethernet is a virtual network that can be spawned over a set of physical computer over the Internet and that can be shared between physical hosts and various kinds of virtual machines. vde_switch, core app of VDE framework, is an evolution of uml_switch. The project was originally written by Renzo Davoli and now is maintained and developed by Virtualsquare Team (which I'm part of).
For more information and simple examples of vde usage visit:
http://wiki.virtualsquare.org/index.php/VDE and
http://wiki.virtualsquare.org/index.php/VDE_Basic_Networking
Right now you can already connect to vde_switch with user-mode-linux in a dirty way using daemon backend ( eth0=daemon,,,/tmp/switch1/ctl ), but with vde network backend you can take advantage of greater flexibility and transparency provided by libvdeplug.
For example you can connect to a specific switch port that can be already configured with 802.1Q, you can provide a description for uml instance to be able to better distinguish the port in complex configurations and you can specify data socket permissions.
Regards,
Luca
Signature · 4 lines
Beware of programmers who carry screwdrivers.
-- Leonard Brandwein
http://shammash.homelinux.org/ - http://www.artha.org/ - http://www.yue.it/arch/um/Kconfig.net +22 -0
@@ -108,6 +108,28 @@ config UML_NET_DAEMON more than one without conflict. If you don't need UML networking, say N. +config UML_NET_VDE + bool "VDE transport" + depends on UML_NET + help + This User-Mode Linux network transport allows one or more running + UMLs on a single host to communicate with each other and also + with the rest of the world using Virtual Distributed Ethernet, + an improved fork of uml_switch. + + You must have libvdeplug installed in order to build the vde + transport into UML. + + To use this form of networking, you will need to run vde_switch + on the host. + + For more information, see <http://wiki.virtualsquare.org/> + That site has a good overview of what VDE is and also examples + of the UML command line to use to enable VDE networking. + + If you need UML networking with VDE, + say Y. + config UML_NET_MCAST bool "Multicast transport" depends on UML_NET
arch/um/drivers/Makefile +8 -2
@@ -18,11 +18,16 @@ port-objs := port_kern.o port_user.o harddog-objs := harddog_kern.o harddog_user.o LDFLAGS_pcap.o := -r $(shell $(CC) $(CFLAGS) -print-file-name=libpcap.a) +LDFLAGS_vde.o := -r $(shell $(CC) $(CFLAGS) -print-file-name=libvdeplug.a) -targets := pcap_kern.o pcap_user.o +targets := pcap_kern.o pcap_user.o vde_kern.o vde_user.o $(obj)/pcap.o: $(obj)/pcap_kern.o $(obj)/pcap_user.o $(LD) -r -dp -o $@ $^ $(LDFLAGS) $(LDFLAGS_pcap.o) + +$(obj)/vde.o: $(obj)/vde_kern.o $(obj)/vde_user.o + $(LD) -r -dp -o $@ $^ $(LDFLAGS) $(LDFLAGS_vde.o) + #XXX: The call below does not work because the flags are added before the # object name, so nothing from the library gets linked. #$(call if_changed,ld)
@@ -37,6 +42,7 @@ obj-$(CONFIG_STDERR_CONSOLE) += stderr_c obj-$(CONFIG_UML_NET_SLIP) += slip.o slip_common.o obj-$(CONFIG_UML_NET_SLIRP) += slirp.o slip_common.o obj-$(CONFIG_UML_NET_DAEMON) += daemon.o +obj-$(CONFIG_UML_NET_VDE) += vde.o obj-$(CONFIG_UML_NET_MCAST) += mcast.o obj-$(CONFIG_UML_NET_PCAP) += pcap.o obj-$(CONFIG_UML_NET) += net.o
@@ -54,6 +60,6 @@ obj-$(CONFIG_BLK_DEV_COW_COMMON) += cow_ obj-$(CONFIG_UML_RANDOM) += random.o # pcap_user.o must be added explicitly. -USER_OBJS := fd.o null.o pty.o tty.o xterm.o slip_common.o pcap_user.o +USER_OBJS := fd.o null.o pty.o tty.o xterm.o slip_common.o pcap_user.o vde_user.o include arch/um/scripts/Makefile.rules
arch/um/drivers/vde.h +27 -0
@@ -0,0 +1,27 @@ +/* +* Copyright (C) 2007 Luca Bigliardi ([email protected]). +* Licensed under the GPL. +*/ + +struct vde_data { +char *vde_switch; +char *descr; +void *args; +void *conn; +void *dev; +}; + +struct vde_init { +char *vde_switch; +char *descr; +int port; +char *group; +int mode; +}; + +extern const struct net_user_info vde_user_info; + +extern void vde_init_libstuff (struct vde_data *vpri,struct vde_init *init); + +extern int vde_user_read (void *conn,void *buf,int len); +extern int vde_user_write (void *conn,void *buf,int len);
arch/um/drivers/vde_kern.c +138 -0
138 lines not on this page · raw message
arch/um/drivers/vde_user.c +129 -0
129 lines not on this page · raw message
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
User-mode-linux-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
Quoted 9 lines · Luca Bigliardi
Hi,
I've written a new network backend for user-mode-linux using libvdeplug to connect to avde_switch. In the following lines I've made a little description of what VDE is and I've written a couple of examples to give you an idea of the benefits you can have using this backend.Please tell me what do you think about vde-transport and its first implementation I'm attaching in this mail (It's a patch developed on 2.6.22.1 vanilla).
Looks reasonable (and useful). Do you want me to drop it in my tree and forward it to mainline? If so, I'll need a changelog and a Signed-off-by:.
Some comments -
style violations :
there are some cases of return(x) which should be
return x
if( blah ){ should be if(blah) {
if(foo) return bar - the return should be on the nextline
the indentation of multi-line function calls is whacked
I would leave out the likely()s. Unless you can show a
noticable performance difference, they only clutter the code.
printks should have severity specified (in userspace code,
they are available as UM_KERN_*)
um_kmalloc is gone - use kmalloc with UM_GFP_KERNEL
I realize that you probably copied many of the above problems from the existing code. All I can say is that I'm gradually fixing them, and I'd rather not add new instances.
Jeff
Signature · 11 lines
Work email - jdike at linux dot intel dot com ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ User-mode-linux-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
Quoted 2 lines · Jeff Dike
Looks reasonable (and useful). Do you want me to drop it in my tree and forward it to mainline?
Yes please, that would be great.
Quoted 1 line
If so, I'll need a changelog and a Signed-off-by:.
Here they are. I hope changelog is clear enought. Please tell me if you want a properly formatted e-mail to submit to mainline.
Added vde network backend in uml to introduce native Virtual Distributed Ethernet support (using libvdeplug).
Quoted 6 lines
Some comments -
style violations :
there are some cases of return(x) which should be
return xif( blah ){ should be if(blah) { if(foo) return bar - the return should be on the next
Quoted 8 lines
line
the indentation of multi-line function calls is whackedI would leave out the likely()s. Unless you can show a
noticable performance difference, they only clutter the code.
printks should have severity specified (in userspace code,
they are available as UM_KERN_*)
um_kmallocis gone - use kmalloc withUM_GFP_KERNEL
Thank you. I'm attaching a new patch with some corrections tested on a 2.6.23-rc1-git1. I especially hope indentation of multi-line function calls is getting better (I'm trusting vim's "gq", please tell me how's going).
Quoted 3 lines
I realize that you probably copied many of the above problems from the existing code. All I can say is that I'm gradually fixing them, and I'd rather not add new instances.
Yes, in fact i was getting "deeply inspired" :) by some existing parts without paying enought attention to syntax.
luca
Signature · 4 lines
Beware of programmers who carry screwdrivers.
-- Leonard Brandwein
http://shammash.homelinux.org/ - http://www.artha.org/ - http://www.yue.it/arch/um/Kconfig.net +22 -0
@@ -108,6 +108,28 @@ config UML_NET_DAEMON more than one without conflict. If you don't need UML networking, say N. +config UML_NET_VDE + bool "VDE transport" + depends on UML_NET + help + This User-Mode Linux network transport allows one or more running + UMLs on a single host to communicate with each other and also + with the rest of the world using Virtual Distributed Ethernet, + an improved fork of uml_switch. + + You must have libvdeplug installed in order to build the vde + transport into UML. + + To use this form of networking, you will need to run vde_switch + on the host. + + For more information, see <http://wiki.virtualsquare.org/> + That site has a good overview of what VDE is and also examples + of the UML command line to use to enable VDE networking. + + If you need UML networking with VDE, + say Y. + config UML_NET_MCAST bool "Multicast transport" depends on UML_NET
arch/um/drivers/Makefile +8 -2
@@ -18,11 +18,16 @@ port-objs := port_kern.o port_user.o harddog-objs := harddog_kern.o harddog_user.o LDFLAGS_pcap.o := -r $(shell $(CC) $(CFLAGS) -print-file-name=libpcap.a) +LDFLAGS_vde.o := -r $(shell $(CC) $(CFLAGS) -print-file-name=libvdeplug.a) -targets := pcap_kern.o pcap_user.o +targets := pcap_kern.o pcap_user.o vde_kern.o vde_user.o $(obj)/pcap.o: $(obj)/pcap_kern.o $(obj)/pcap_user.o $(LD) -r -dp -o $@ $^ $(LDFLAGS) $(LDFLAGS_pcap.o) + +$(obj)/vde.o: $(obj)/vde_kern.o $(obj)/vde_user.o + $(LD) -r -dp -o $@ $^ $(LDFLAGS) $(LDFLAGS_vde.o) + #XXX: The call below does not work because the flags are added before the # object name, so nothing from the library gets linked. #$(call if_changed,ld)
@@ -37,6 +42,7 @@ obj-$(CONFIG_STDERR_CONSOLE) += stderr_c obj-$(CONFIG_UML_NET_SLIP) += slip.o slip_common.o obj-$(CONFIG_UML_NET_SLIRP) += slirp.o slip_common.o obj-$(CONFIG_UML_NET_DAEMON) += daemon.o +obj-$(CONFIG_UML_NET_VDE) += vde.o obj-$(CONFIG_UML_NET_MCAST) += mcast.o obj-$(CONFIG_UML_NET_PCAP) += pcap.o obj-$(CONFIG_UML_NET) += net.o
@@ -54,6 +60,6 @@ obj-$(CONFIG_BLK_DEV_COW_COMMON) += cow_ obj-$(CONFIG_UML_RANDOM) += random.o # pcap_user.o must be added explicitly. -USER_OBJS := fd.o null.o pty.o tty.o xterm.o slip_common.o pcap_user.o +USER_OBJS := fd.o null.o pty.o tty.o xterm.o slip_common.o pcap_user.o vde_user.o include arch/um/scripts/Makefile.rules
arch/um/drivers/vde.h +27 -0
@@ -0,0 +1,27 @@ +/* +* Copyright (C) 2007 Luca Bigliardi ([email protected]). +* Licensed under the GPL. +*/ + +struct vde_data { +char *vde_switch; +char *descr; +void *args; +void *conn; +void *dev; +}; + +struct vde_init { +char *vde_switch; +char *descr; +int port; +char *group; +int mode; +}; + +extern const struct net_user_info vde_user_info; + +extern void vde_init_libstuff (struct vde_data *vpri,struct vde_init *init); + +extern int vde_user_read (void *conn,void *buf,int len); +extern int vde_user_write (void *conn,void *buf,int len);
arch/um/drivers/vde_kern.c +136 -0
136 lines not on this page · raw message
arch/um/drivers/vde_user.c +136 -0
136 lines not on this page · raw message
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
User-mode-linux-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
Quoted 3 lines · Jeff Dike
style violations :
if( blah ){ should be if(blah) {Hmm - I know I'm a bit too late, but that should be "if (blah) {", with a space after if (or after for, or after while (blah) { ).
Bye
Signature · 4 lines
"Doh!" (cit.), I've made another another mistake! Paolo Giarrusso, aka Blaisorblade Linux registered user n. 292729 http://www.user-mode-linux.org/~blaisorblade
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
User-mode-linux-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
Quoted 2 lines · Blaisorblade
Hmm - I know I'm a bit too late, but that should be "if (blah) {", with a space after if (or after for, or after while (blah) { ).
Thank you, I'm attaching a new patch with proper changes.
luca
Signature · 4 lines
Beware of programmers who carry screwdrivers.
-- Leonard Brandwein
http://shammash.homelinux.org/ - http://www.artha.org/ - http://www.yue.it/arch/um/Kconfig.net +22 -0
@@ -108,6 +108,28 @@ config UML_NET_DAEMON more than one without conflict. If you don't need UML networking, say N. +config UML_NET_VDE + bool "VDE transport" + depends on UML_NET + help + This User-Mode Linux network transport allows one or more running + UMLs on a single host to communicate with each other and also + with the rest of the world using Virtual Distributed Ethernet, + an improved fork of uml_switch. + + You must have libvdeplug installed in order to build the vde + transport into UML. + + To use this form of networking, you will need to run vde_switch + on the host. + + For more information, see <http://wiki.virtualsquare.org/> + That site has a good overview of what VDE is and also examples + of the UML command line to use to enable VDE networking. + + If you need UML networking with VDE, + say Y. + config UML_NET_MCAST bool "Multicast transport" depends on UML_NET
arch/um/drivers/Makefile +8 -2
@@ -18,11 +18,16 @@ port-objs := port_kern.o port_user.o harddog-objs := harddog_kern.o harddog_user.o LDFLAGS_pcap.o := -r $(shell $(CC) $(CFLAGS) -print-file-name=libpcap.a) +LDFLAGS_vde.o := -r $(shell $(CC) $(CFLAGS) -print-file-name=libvdeplug.a) -targets := pcap_kern.o pcap_user.o +targets := pcap_kern.o pcap_user.o vde_kern.o vde_user.o $(obj)/pcap.o: $(obj)/pcap_kern.o $(obj)/pcap_user.o $(LD) -r -dp -o $@ $^ $(LDFLAGS) $(LDFLAGS_pcap.o) + +$(obj)/vde.o: $(obj)/vde_kern.o $(obj)/vde_user.o + $(LD) -r -dp -o $@ $^ $(LDFLAGS) $(LDFLAGS_vde.o) + #XXX: The call below does not work because the flags are added before the # object name, so nothing from the library gets linked. #$(call if_changed,ld)
@@ -37,6 +42,7 @@ obj-$(CONFIG_STDERR_CONSOLE) += stderr_c obj-$(CONFIG_UML_NET_SLIP) += slip.o slip_common.o obj-$(CONFIG_UML_NET_SLIRP) += slirp.o slip_common.o obj-$(CONFIG_UML_NET_DAEMON) += daemon.o +obj-$(CONFIG_UML_NET_VDE) += vde.o obj-$(CONFIG_UML_NET_MCAST) += mcast.o obj-$(CONFIG_UML_NET_PCAP) += pcap.o obj-$(CONFIG_UML_NET) += net.o
@@ -54,6 +60,6 @@ obj-$(CONFIG_BLK_DEV_COW_COMMON) += cow_ obj-$(CONFIG_UML_RANDOM) += random.o # pcap_user.o must be added explicitly. -USER_OBJS := fd.o null.o pty.o tty.o xterm.o slip_common.o pcap_user.o +USER_OBJS := fd.o null.o pty.o tty.o xterm.o slip_common.o pcap_user.o vde_user.o include arch/um/scripts/Makefile.rules
arch/um/drivers/vde.h +27 -0
@@ -0,0 +1,27 @@ +/* +* Copyright (C) 2007 Luca Bigliardi ([email protected]). +* Licensed under the GPL. +*/ + +struct vde_data { +char *vde_switch; +char *descr; +void *args; +void *conn; +void *dev; +}; + +struct vde_init { +char *vde_switch; +char *descr; +int port; +char *group; +int mode; +}; + +extern const struct net_user_info vde_user_info; + +extern void vde_init_libstuff (struct vde_data *vpri,struct vde_init *init); + +extern int vde_user_read (void *conn,void *buf,int len); +extern int vde_user_write (void *conn,void *buf,int len);
arch/um/drivers/vde_kern.c +136 -0
136 lines not on this page · raw message
arch/um/drivers/vde_user.c +136 -0
136 lines not on this page · raw message
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
User-mode-linux-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
Quoted 1 line · Luca Bigliardi
Thank you, I'm attaching a new patch with proper changes.
What did you change? BB was right to comment on my changelog, but I don't see any examples of if( blah ) { anywhere in the vde code.
Since the main patch is in -mm, if you have changes, send incremental patches, not updated full patches.
Jeff
Signature · 11 lines
Work email - jdike at linux dot intel dot com ------------------------------------------------------------------------- This SF.net email is sponsored by: Splunk Inc. Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/ _______________________________________________ User-mode-linux-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel
Quoted 2 lines · Jeff Dike
What did you change? BB was right to comment on my changelog, but I don't see any examples of if( blah ) { anywhere in the vde code.
I've changed "if(blah)" into "if (blah)".
Quoted 2 lines
Since the main patch is in -mm, if you have changes, send incremental patches, not updated full patches.
I'm sorry. I'm attaching the diff between the -mm patch and the newer one.
luca
Signature · 4 lines
Beware of programmers who carry screwdrivers.
-- Leonard Brandwein
http://shammash.homelinux.org/ - http://www.artha.org/ - http://www.yue.it/uml_vdetransport-03.patch renamed from uml_vdetransport-02.patch +17 -17
@@ -142,9 +142,9 @@ +{ + struct vde_data *pri = (struct vde_data *) &lp->user; + -+ if(pri->conn != NULL) { ++ if (pri->conn != NULL) { + *skb = ether_adjust_skb(*skb, ETH_HEADER_OTHER); -+ if(*skb == NULL) ++ if (*skb == NULL) + return -ENOMEM; + + return vde_user_read(pri->conn, skb_mac_header(*skb),
@@ -159,7 +159,7 @@ +{ + struct vde_data *pri = (struct vde_data *) &lp->user; + -+ if(pri->conn != NULL) ++ if (pri->conn != NULL) + return vde_user_write((void *)pri->conn, (*skb)->data, + (*skb)->len); +
@@ -189,22 +189,22 @@ + remain = split_if_spec(str, &init->vde_switch, mac_out, &port_str, + &init->group, &mode_str, &init->descr, NULL); + -+ if(remain != NULL) ++ if (remain != NULL) + printk(KERN_WARNING "vde_setup - Ignoring extra data :" + "'%s'\n", remain); + -+ if(port_str != NULL) { ++ if (port_str != NULL) { + init->port = simple_strtoul(port_str, &last, 10); -+ if((*last != '\0') || (last == port_str)) { ++ if ((*last != '\0') || (last == port_str)) { + printk(KERN_ERR "vde_setup - Bad port : '%s'\n", + port_str); + return 0; + } + } + -+ if(mode_str != NULL) { ++ if (mode_str != NULL) { + init->mode = simple_strtoul(mode_str, &last, 8); -+ if((*last != '\0') || (last == mode_str)) { ++ if ((*last != '\0') || (last == mode_str)) { + printk(KERN_ERR "vde_setup - Bad mode : '%s'\n", + mode_str); + return 0;
@@ -265,7 +265,7 @@ + + conn = vde_open(pri->vde_switch, pri->descr, pri->args); + -+ if(conn == NULL) { ++ if (conn == NULL) { + err = -errno; + printk(UM_KERN_ERR "vde_user_init: vde_open failed, " + "errno = %d\n", errno);
@@ -283,7 +283,7 @@ +{ + struct vde_data *pri = data; + -+ if(pri->conn != NULL) ++ if (pri->conn != NULL) + return vde_datafd(pri->conn); + + printk(UM_KERN_WARNING "vde_open - we have no VDECONN to open");
@@ -294,7 +294,7 @@ +{ + struct vde_data *pri = data; + -+ if(pri->conn != NULL) { ++ if (pri->conn != NULL) { + printk(UM_KERN_INFO "vde backend - closing connection\n"); + vde_close(pri->conn); + pri->conn = NULL;
@@ -327,7 +327,7 @@ + struct vde_open_args *args; + + vpri->args = kmalloc(sizeof(struct vde_open_args), UM_GFP_KERNEL); -+ if(vpri->args == NULL) { ++ if (vpri->args == NULL) { + printk(UM_KERN_ERR "\nvde_init_libstuff - vde_open_args" + "allocation failed"); + return;
@@ -348,16 +348,16 @@ + VDECONN *vconn = (VDECONN *) conn; + int rv; + -+ if(vconn == NULL) ++ if (vconn == NULL) + return 0; + + rv = vde_recv(vconn, buf, len, 0); -+ if(rv < 0) { -+ if(errno == EAGAIN) ++ if (rv < 0) { ++ if (errno == EAGAIN) + return 0; + return -errno; + } -+ else if(rv == 0) ++ else if (rv == 0) + return -ENOTCONN; + + return rv;
@@ -367,7 +367,7 @@ +{ + VDECONN *vconn = (VDECONN *) conn; + -+ if(vconn == NULL) ++ if (vconn == NULL) + return 0; + + return vde_send(vconn, buf, len, 0);
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
User-mode-linux-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/user-mode-linux-devel