qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Benjamin <mlspirat42@gmail.com>
To: Jan Kiszka <jan.kiszka@siemens.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] Integrating Dynamips and GNS3 UDP tunnels (Patches)
Date: Sat, 08 Oct 2011 19:31:33 +0200	[thread overview]
Message-ID: <4E9088F5.5020304@gmail.com> (raw)
In-Reply-To: <4E8EB9B7.4000007@siemens.com>

On 10/07/11 10:35, Jan Kiszka wrote:
 >
 > You should send out the changes as proper patch series, rebased on
 > current git head. See http://wiki.qemu.org/Contribute/SubmitAPatch for
 > further requirements. And make sure that no patch breaks the build so
 > that bisectability is preserved.
 >
 > Jan
 >

Tested and used for several years by GNS3, it doesn't break the build.

I could not access http://git.qemu.org/qemu.git/plain/CODING_STYLE and
http://git.qemu.org/qemu.git/plain/HACKING (404) so these patches may
not be 100% conform. The script didn't report any error though.

Signed-off-by: Benjamin MARSILI <marsil_b@epitech.eu> 


diff --git a/Makefile.objs b/Makefile.objs
index 8d23fbb..6b4896b 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -45,6 +45,7 @@ net-obj-y = net.o
  net-nested-y = queue.o checksum.o util.o
  net-nested-y += socket.o
  net-nested-y += dump.o
+net-nested-y += udp.o
  net-nested-$(CONFIG_POSIX) += tap.o
  net-nested-$(CONFIG_LINUX) += tap-linux.o
  net-nested-$(CONFIG_WIN32) += tap-win32.o
diff --git a/net.c b/net.c
index d05930c..6a3b2ba 100644
--- a/net.c
+++ b/net.c
@@ -30,6 +30,7 @@
  #include "net/dump.h"
  #include "net/slirp.h"
  #include "net/vde.h"
+#include "net/udp.h"
  #include "net/util.h"
  #include "monitor.h"
  #include "qemu-common.h"
@@ -1036,6 +1037,27 @@ static const struct {
          },
      },
  #endif
+    [NET_CLIENT_TYPE_UDP] = {
+        .type = "udp",
+        .init = net_init_udp,
+        .desc = {
+            NET_COMMON_PARAMS_DESC,
+            {
+                .name = "sport",
+                .type = QEMU_OPT_NUMBER,
+                .help = "source port number",
+            }, {
+                .name = "daddr",
+                .type = QEMU_OPT_STRING,
+                .help = "destination IP address",
+            }, {
+                .name = "dport",
+                .type = QEMU_OPT_NUMBER,
+                .help = "destination port number",
+            },
+            { /* end of list */ }
+        },
+    },
      [NET_CLIENT_TYPE_DUMP] = {
          .type = "dump",
          .init = net_init_dump,
diff --git a/net.h b/net.h
index 9f633f8..ac6118c 100644
--- a/net.h
+++ b/net.h
@@ -35,6 +35,7 @@ typedef enum {
      NET_CLIENT_TYPE_TAP,
      NET_CLIENT_TYPE_SOCKET,
      NET_CLIENT_TYPE_VDE,
+    NET_CLIENT_TYPE_UDP,
      NET_CLIENT_TYPE_DUMP,

      NET_CLIENT_TYPE_MAX
diff --git a/net/udp.c b/net/udp.c
new file mode 100644
index 0000000..7b4b702
--- /dev/null
+++ b/net/udp.c
@@ -0,0 +1,140 @@
+/*
+ * QEMU System Emulator
+ *
+ * Copyright (c) 2003-2008 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person 
obtaining a copy
+ * of this software and associated documentation files (the 
"Software"), to deal
+ * in the Software without restriction, including without limitation 
the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or 
sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be 
included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 
OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 
ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
DEALINGS IN
+ * THE SOFTWARE.
+ */
+#include "net/udp.h"
+
+#include "config-host.h"
+
+#ifndef _WIN32
+#include <arpa/inet.h>
+#include <netinet/in.h>
+#include <netinet/udp.h>
+#endif
+
+#include "net.h"
+#include "qemu-char.h"
+#include "qemu-common.h"
+#include "qemu-option.h"
+#include "qemu_socket.h"
+#include "sysemu.h"
+
+
+typedef struct UDPState {
+    VLANClientState nc;
+    int rfd;
+    struct sockaddr_in sender;
+} UDPState;
+
+static void udp_to_qemu(void *opaque)
+{
+    UDPState *s = opaque;
+    uint8_t buf[4096];
+    int size;
+
+    size = recvfrom(s->rfd, (char *)buf, sizeof(buf), 0, NULL, NULL);
+    if (size > 0) {
+        qemu_send_packet(&s->nc, buf, size);
+    }
+}
+
+static ssize_t udp_receive(VLANClientState *nc, const uint8_t *buf, 
size_t size)
+{
+    UDPState *s = DO_UPCAST(UDPState, nc, nc);
+    int ret;
+
+    do {
+        ret = sendto(s->rfd, (const char *)buf, size, 0,
+               (struct sockaddr *)&s->sender, sizeof(s->sender));
+    } while (ret < 0 && errno == EINTR);
+
+    return ret;
+}
+
+static void udp_cleanup(VLANClientState *nc)
+{
+    UDPState *s = DO_UPCAST(UDPState, nc, nc);
+    qemu_set_fd_handler(s->rfd, NULL, NULL, NULL);
+    close(s->rfd);
+}
+
+static NetClientInfo net_udp_info = {
+    .type = NET_CLIENT_TYPE_UDP,
+    .size = sizeof(UDPState),
+    .receive = udp_receive,
+    .cleanup = udp_cleanup,
+};
+
+static int net_udp_init(VLANState *vlan, const char *model,
+                        const char *name, int sport,
+                        const char *daddr, int dport)
+{
+    VLANClientState *nc;
+    UDPState *s;
+    struct sockaddr_in receiver;
+    int ret;
+
+    nc = qemu_new_net_client(&net_udp_info, vlan, NULL, model, name);
+
+    snprintf(nc->info_str, sizeof(nc->info_str), "udp: %i->%s:%i",
+        sport, daddr, dport);
+
+    s = DO_UPCAST(UDPState, nc, nc);
+
+    s->rfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
+    receiver.sin_family = AF_INET;
+    receiver.sin_addr.s_addr = INADDR_ANY;
+    receiver.sin_port = htons(sport);
+    ret = bind(s->rfd, (struct sockaddr *)&receiver, sizeof(receiver));
+
+    if (ret == -1) {
+        fprintf(stderr, "bind error:%s\n", strerror(errno));
+        return ret;
+    }
+
+    memset((char *)&s->sender, 0, sizeof(s->sender));
+    s->sender.sin_family = AF_INET;
+    s->sender.sin_port = htons(dport);
+    inet_aton(daddr, &s->sender.sin_addr);
+
+    qemu_set_fd_handler(s->rfd, udp_to_qemu, NULL, s);
+
+    return 0;
+}
+
+int net_init_udp(QemuOpts *opts, Monitor *mon,
+                 const char *name, VLANState *vlan)
+{
+    const char *daddr;
+    int sport, dport;
+
+    daddr  = qemu_opt_get(opts, "daddr");
+
+    sport = qemu_opt_get_number(opts, "sport", 0);
+    dport = qemu_opt_get_number(opts, "dport", 0);
+
+    if (net_udp_init(vlan, "udp", name, sport, daddr, dport) == -1) {
+        return -1;
+    }
+
+    return 0;
+}
diff --git a/net/udp.h b/net/udp.h
new file mode 100644
index 0000000..e614077
--- /dev/null
+++ b/net/udp.h
@@ -0,0 +1,32 @@
+/*
+ * QEMU System Emulator
+ *
+ * Copyright (c) 2003-2008 Fabrice Bellard
+ *
+ * Permission is hereby granted, free of charge, to any person 
obtaining a copy
+ * of this software and associated documentation files (the 
"Software"), to deal
+ * in the Software without restriction, including without limitation 
the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or 
sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be 
included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 
OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 
ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
DEALINGS IN
+ * THE SOFTWARE.
+ */
+#ifndef QEMU_NET_UDP_H
+#define QEMU_NET_UDP_H
+
+#include "qemu-common.h"
+#include "qemu-option.h"
+
+int net_init_udp(QemuOpts*, Monitor*, const char *name, VLANState*);
+
+#endif /* QEMU_NET_UDP_H */
diff --git a/qemu-options.hx b/qemu-options.hx
index dfbabd0..021d898 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -1145,6 +1145,8 @@ DEF("net", HAS_ARG, QEMU_OPTION_net,
      "                connect the user mode network stack to VLAN 'n', 
configure its\n"
      "                DHCP server and enabled optional services\n"
  #endif
+    "-net udp[,vlan=n],sport=sport,dport=dport,daddr=host\n"
+    "                connect the vlan 'n' to a udp host (for 
dynamips/pemu/GNS3)\n"
  #ifdef _WIN32
      "-net tap[,vlan=n][,name=str],ifname=name\n"
      "                connect the host TAP network interface to VLAN 'n'\n"

  reply	other threads:[~2011-10-08  8:31 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 [this message]
2011-10-08  9:29     ` Jan Kiszka
2011-10-09 17:02       ` Benjamin
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
2011-11-06 14:28         ` [Qemu-devel] [PATCH] " Benjamin Epitech
2011-10-08  9:37     ` [Qemu-devel] Integrating Dynamips and GNS3 UDP tunnels (Patches) Stefan Weil

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4E9088F5.5020304@gmail.com \
    --to=mlspirat42@gmail.com \
    --cc=jan.kiszka@siemens.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).