qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2] Support for UDP unicast network backend
@ 2011-11-25 12:49 Benjamin
  2011-11-28 11:39 ` Stefan Hajnoczi
  0 siblings, 1 reply; 7+ messages in thread
From: Benjamin @ 2011-11-25 12:49 UTC (permalink / raw)
  To: qemu-devel; +Cc: andreas.faerber, jan.kiszka, Benjamin MARSILI

From: Benjamin MARSILI <marsil_b@epitech.eu>

Signed-off-by: Benjamin MARSILI <marsil_b@epitech.eu>
---
 net.c           |    6 ++++-
 net/socket.c    |   71 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 qemu-options.hx |    2 +
 3 files changed, 76 insertions(+), 3 deletions(-)

diff --git a/net.c b/net.c
index cb52050..8e957b2 100644
--- a/net.c
+++ b/net.c
@@ -999,7 +999,11 @@ static const struct {
             }, {
                 .name = "localaddr",
                 .type = QEMU_OPT_STRING,
-                .help = "source address for multicast packets",
+                .help = "source address and port for multicast and udp packets",
+            }, {
+                .name = "udp",
+                .type = QEMU_OPT_STRING,
+                .help = "UDP unicast address and port number",
             },
             { /* end of list */ }
         },
diff --git a/net/socket.c b/net/socket.c
index e9ef128..ca183f2 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -524,6 +524,55 @@ static int net_socket_mcast_init(VLANState *vlan,
 
 }
 
+static int net_socket_udp_init(VLANState *vlan,
+                                 const char *model,
+                                 const char *name,
+                                 const char *rhost,
+                                 const char *lhost)
+{
+    NetSocketState *s;
+    int fd, val, ret;
+    struct sockaddr_in laddr, raddr;
+
+    if (parse_host_port(&laddr, lhost) < 0) {
+        return -1;
+    }
+
+    if (parse_host_port(&raddr, rhost) < 0) {
+        return -1;
+    }
+
+    fd = qemu_socket(PF_INET, SOCK_DGRAM, 0);
+    if (fd < 0) {
+        perror("socket(PF_INET, SOCK_DGRAM)");
+        return -1;
+    }
+    val = 1;
+    ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
+                   (const char *)&val, sizeof(val));
+    if (ret < 0) {
+        perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
+        return -1;
+    }
+    ret = bind(fd, (struct sockaddr *)&laddr, sizeof(laddr));
+    if (ret < 0) {
+        perror("bind");
+        return -1;
+    }
+
+    s = net_socket_fd_init(vlan, model, name, fd, 0);
+    if (!s) {
+        return -1;
+    }
+
+    s->dgram_dst = raddr;
+
+    snprintf(s->nc.info_str, sizeof(s->nc.info_str),
+             "socket: udp=%s:%d",
+             inet_ntoa(raddr.sin_addr), ntohs(raddr.sin_port));
+    return 0;
+}
+
 int net_init_socket(QemuOpts *opts,
                     Monitor *mon,
                     const char *name,
@@ -597,10 +646,28 @@ int net_init_socket(QemuOpts *opts,
         if (net_socket_mcast_init(vlan, "socket", name, mcast, localaddr) == -1) {
             return -1;
         }
+    } else if (qemu_opt_get(opts, "udp")) {
+        const char *udp, *localaddr;
+
+        if (qemu_opt_get(opts, "fd") ||
+            qemu_opt_get(opts, "connect") ||
+            qemu_opt_get(opts, "listen") ||
+            qemu_opt_get(opts, "mcast")) {
+            error_report("fd=, connect=, listen=\
+                         and mcast= is invalid with udp=");
+            return -1;
+        }
+
+        udp = qemu_opt_get(opts, "udp");
+        localaddr = qemu_opt_get(opts, "localaddr");
+
+        if (net_socket_udp_init(vlan, "udp", name, udp, localaddr) == -1) {
+            return -1;
+        }
     } else {
-        error_report("-socket requires fd=, listen=, connect= or mcast=");
+        error_report("-socket requires fd=, listen=, \
+                     connect=, mcast= or udp=");
         return -1;
     }
-
     return 0;
 }
diff --git a/qemu-options.hx b/qemu-options.hx
index 681eaf1..5495368 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -1217,6 +1217,8 @@ DEF("net", HAS_ARG, QEMU_OPTION_net,
     "-net socket[,vlan=n][,name=str][,fd=h][,mcast=maddr:port[,localaddr=addr]]\n"
     "                connect the vlan 'n' to multicast maddr and port\n"
     "                use 'localaddr=addr' to specify the host address to send packets from\n"
+    "-net socket[,vlan=n][,name=str][,fd=h][,udp=host:port][,localaddr=host:port]\n"
+    "                connect the vlan 'n' to another VLAN using an UDP tunnel\n"
 #ifdef CONFIG_VDE
     "-net vde[,vlan=n][,name=str][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode]\n"
     "                connect the vlan 'n' to port 'n' of a vde switch running\n"
-- 
1.7.3.5

^ permalink raw reply related	[flat|nested] 7+ messages in thread
* [Qemu-devel] Integrating Dynamips and GNS3 UDP tunnels (Patches)
@ 2011-10-06 17:08 Benjamin Epitech
  2011-10-07  8:35 ` Jan Kiszka
  0 siblings, 1 reply; 7+ messages in thread
From: Benjamin Epitech @ 2011-10-06 17:08 UTC (permalink / raw)
  To: qemu-devel

[-- Attachment #1: Type: text/plain, Size: 1655 bytes --]

GNS3 team developed a GUI in order to inter-connect different emulated
hardware. In order
to achieve a network inter-connection between each hosts, one single
protocol is used: an
UDP tunneling protocol introduced by Dynamips (a cisco hardware emulator).

Since the beginning, GNS3 supports Qemu by providing patches for its users,
these patches
bring to Qemu the implementation of Dynamips UDP tunneling protocol.

As GNS3 improves and now supports VirtualBox, it should be time to free
users of the assle
of having to patch Qemu themselves. FreeBSD integrated our patches in the
ports tree, we
ship a patched Qemu for Windows, and we're now looking forward to integrate
those patches
upstream.

Here are the patches that apply on the latest release of Qemu, I hereby
submit them for your
approval or not.

1) Basic patch in order to build the new source file
http://code.gns3.net/qemu-patches/file/6a927b6cdaf8/Makefile_objs.patch

2) Parse -net udp
http://code.gns3.net/qemu-patches/file/6a927b6cdaf8/net_c.patch

3) New NET_CLIENT_TYPE_UDP macro
http://code.gns3.net/qemu-patches/file/6a927b6cdaf8/net_h.patch

4) New source code file, implementation of the UDP tunneling protocol
http://code.gns3.net/qemu-patches/file/6a927b6cdaf8/net_udp_c.patch

5) Corresponding header file
http://code.gns3.net/qemu-patches/file/6a927b6cdaf8/net_udp_h.patch

The hw_e1000_c.patch is no longer needed, it was a dirty hack that we kept
for too long.
The block_raw-win32_c.patch fixes a minor issue that arises only on Windows,
it may deserve
another topic.

Please include me in the replies as I am not subscribed to the list.

Regards,

Benjamin
GNS3 contributor

[-- Attachment #2: Type: text/html, Size: 2209 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2011-11-29 10:45 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-25 12:49 [Qemu-devel] [PATCH v2] Support for UDP unicast network backend Benjamin
2011-11-28 11:39 ` Stefan Hajnoczi
2011-11-29 17:29   ` Benjamin
2011-11-29  9:47     ` Stefan Hajnoczi
2011-11-29 19:45       ` Benjamin
  -- strict thread matches above, loose matches on Subject: below --
2011-10-06 17:08 [Qemu-devel] Integrating Dynamips and GNS3 UDP tunnels (Patches) Benjamin Epitech
2011-10-07  8:35 ` Jan Kiszka
2011-10-08 17:31   ` Benjamin
2011-10-08  9:29     ` Jan Kiszka
2011-11-06 20:55       ` [Qemu-devel] [PATCH] Support for UDP unicast network backend Benjamin
2011-11-06 13:54         ` Jan Kiszka
2011-11-07 14:01           ` Benjamin
2011-11-07 11:23             ` Jan Kiszka
2011-11-07 22:03               ` Benjamin
2011-11-08 10:52                 ` Jan Kiszka
2011-11-09 14:26                   ` Benjamin
2011-11-09 14:53                     ` Benjamin
2011-11-09 10:41                       ` Andreas Färber
2011-11-24  1:02                         ` [Qemu-devel] [PATCH v2] " Benjamin
2011-11-24  9:13                           ` Stefan Hajnoczi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).