It is currently Thu Oct 30, 2014 2:22 pm


All times are UTC




Post new topic Reply to topic  [ 26 posts ]  Go to page 1, 2, 3  Next
Author Message
 Post subject: Patch for Qemu 0.13.0
PostPosted: Mon Dec 27, 2010 9:42 pm 
Offline

Joined: Tue Jul 20, 2010 5:50 pm
Posts: 93
Hello,

below is the e1000 multicast + udp networking patch for Qemu 0.13.0 sources. I have performed some basic testing with ASA on Linux and it worked fine also with KVM acceleration. Once I find out how to compile under windows I will try to post a windows binary as well.

  • Download Qemu 0.13.0 sources:
    Code:
    wget http://wiki.qemu.org/download/qemu-0.13.0.tar.gz
    tar xvzf qemu-0.13.0.tar.gz
    cd qemu-0.13.0
  • Copy and paste the patch below into a file called qemu-13-0-patch-multicast-udp and insert it into the qemu directory above
  • Patch&compile&install the code
    Code:
    patch -p1 -i qemu-13-0-patch-multicast-udp
    ./configure --target-list=i386-softmmu
    make
    make install


e1000 multicast + udp networking patch for Qemu 0.13.0
Code:
diff -ruNB qemu-0.13.0/hw/e1000.c qemu-0.13.0-patched//hw/e1000.c
--- qemu-0.13.0/hw/e1000.c   2010-10-15 22:56:09.000000000 +0200
+++ qemu-0.13.0-patched//hw/e1000.c   2010-12-27 21:21:46.910754903 +0100
@@ -567,7 +567,7 @@
     if (rctl & E1000_RCTL_UPE)         // promiscuous
         return 1;

-    if ((buf[0] & 1) && (rctl & E1000_RCTL_MPE))   // promiscuous mcast
+    if (buf[0] & 1) //&& (rctl & E1000_RCTL_MPE))   // promiscuous mcast
         return 1;

     if ((rctl & E1000_RCTL_BAM) && !memcmp(buf, bcast, sizeof bcast))
diff -ruNB qemu-0.13.0/Makefile.objs qemu-0.13.0-patched//Makefile.objs
--- qemu-0.13.0/Makefile.objs   2010-10-15 22:56:09.000000000 +0200
+++ qemu-0.13.0-patched//Makefile.objs   2010-12-27 20:47:07.060754899 +0100
@@ -25,6 +25,7 @@
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 -ruNB qemu-0.13.0/net/udp.c qemu-0.13.0-patched//net/udp.c
--- qemu-0.13.0/net/udp.c   1970-01-01 01:00:00.000000000 +0100
+++ qemu-0.13.0-patched//net/udp.c   2010-12-27 21:19:17.860754906 +0100
@@ -0,0 +1,138 @@
+/*
+ * 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 -ruNB qemu-0.13.0/net/udp.h qemu-0.13.0-patched//net/udp.h
--- qemu-0.13.0/net/udp.h   1970-01-01 01:00:00.000000000 +0100
+++ qemu-0.13.0-patched//net/udp.h   2010-12-27 20:56:42.000000000 +0100
@@ -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 *opts, Monitor *mon, const char *name, VLANState *vlan);
+
+#endif /* QEMU_NET_UDP_H */
diff -ruNB qemu-0.13.0/net.c qemu-0.13.0-patched//net.c
--- qemu-0.13.0/net.c   2010-10-15 22:56:09.000000000 +0200
+++ qemu-0.13.0-patched//net.c   2010-12-27 21:01:47.570754906 +0100
@@ -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 "sysemu.h"
@@ -1074,6 +1075,26 @@
         },
#endif
     }, {
+        .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 */ }
+        },
+    }, {
         .type = "dump",
         .init = net_init_dump,
         .desc = {
diff -ruNB qemu-0.13.0/net.h qemu-0.13.0-patched//net.h
--- qemu-0.13.0/net.h   2010-10-15 22:56:09.000000000 +0200
+++ qemu-0.13.0-patched//net.h   2010-12-27 21:04:01.730754901 +0100
@@ -33,6 +33,7 @@
     NET_CLIENT_TYPE_TAP,
     NET_CLIENT_TYPE_SOCKET,
     NET_CLIENT_TYPE_VDE,
+    NET_CLIENT_TYPE_UDP,
     NET_CLIENT_TYPE_DUMP
} net_client_type;

diff -ruNB qemu-0.13.0/qemu-options.hx qemu-0.13.0-patched//qemu-options.hx
--- qemu-0.13.0/qemu-options.hx   2010-10-15 22:56:09.000000000 +0200
+++ qemu-0.13.0-patched//qemu-options.hx   2010-12-27 21:06:51.340754899 +0100
@@ -996,6 +996,8 @@
     "                connect the vlan 'n' to another VLAN using a socket connection\n"
     "-net socket[,vlan=n][,name=str][,fd=h][,mcast=maddr:port]\n"
     "                connect the vlan 'n' to multicast maddr and port\n"
+    "-net udp[,vlan=n]sport=sport,dport=dport,daddr=host\n"
+    "                connect the vlan 'n' to a udp host (for Dynamips/GNS3)\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"




Top
 Profile  
 
 Post subject: Re: Patch for Qemu 0.13.0
PostPosted: Mon Dec 27, 2010 10:26 pm 
Offline

Joined: Thu Jun 24, 2010 3:58 pm
Posts: 411
Location: [email protected]
Great gob!!
Can you make it cover the monitor area as well for the hot link add/remove!


Top
 Profile  
 
 Post subject: Re: Patch for Qemu 0.13.0
PostPosted: Mon Dec 27, 2010 11:42 pm 
Offline
Site Admin

Joined: Sat Oct 11, 2008 1:41 pm
Posts: 2668
Location: Canada
Hey its really Christmas!!!

I'll test this soon and compile a static Windows version. I'll also merge your patch with the patch that allows us to run multiple Qemu instances using a base image.

I didn't check the details of your patch because I'm lazy right now ;) What did you changed from the last patch?

Again great job!

_________________
Jeremy, GNS3 Programmer & Benevolent Dictator for Life.


Top
 Profile  
 
 Post subject: Re: Patch for Qemu 0.13.0
PostPosted: Tue Dec 28, 2010 1:45 pm 
Offline

Joined: Thu Jun 24, 2010 3:58 pm
Posts: 411
Location: [email protected]
Thanks Jeremy! I sow that you posted new qemu binary...
I'll test it today :))


Top
 Profile  
 
 Post subject: Re: Patch for Qemu 0.13.0
PostPosted: Tue Dec 28, 2010 1:45 pm 
Offline
Site Admin

Joined: Sat Oct 11, 2008 1:41 pm
Posts: 2668
Location: Canada
Hi,

I had to apply this patch to compile Qemu on Windows. This patch and the UDP/Multicast patch are available for download here.

The patched and compiled Windows version is here.

Cheers,

_________________
Jeremy, GNS3 Programmer & Benevolent Dictator for Life.


Top
 Profile  
 
 Post subject: Re: Patch for Qemu 0.13.0
PostPosted: Tue Dec 28, 2010 1:47 pm 
Offline
Site Admin

Joined: Sat Oct 11, 2008 1:41 pm
Posts: 2668
Location: Canada
Quote:
Thanks Jeremy! I sow that you posted new qemu binary...
I'll test it today :))


You are quick! I haven't had the time to post ;)

_________________
Jeremy, GNS3 Programmer & Benevolent Dictator for Life.


Top
 Profile  
 
 Post subject: Re: Patch for Qemu 0.13.0
PostPosted: Tue Dec 28, 2010 1:50 pm 
Offline

Joined: Thu Jun 24, 2010 3:58 pm
Posts: 411
Location: [email protected]
So the new patch will include also "libusb host USB redirector"

http://www.mail-archive.com/qemu-devel@ ... 03272.html
Quote:
With these patches I am able to mount a flash drive and copy some
files to the guest.


Top
 Profile  
 
 Post subject: Re: Patch for Qemu 0.13.0
PostPosted: Tue Dec 28, 2010 2:03 pm 
Offline
Site Admin

Joined: Sat Oct 11, 2008 1:41 pm
Posts: 2668
Location: Canada
Yep but I haven't tested it. This is supposed to be stable ;)

_________________
Jeremy, GNS3 Programmer & Benevolent Dictator for Life.


Top
 Profile  
 
 Post subject: Re: Patch for Qemu 0.13.0
PostPosted: Tue Dec 28, 2010 3:02 pm 
Offline

Joined: Tue Jul 20, 2010 5:50 pm
Posts: 93
Thanks, seems like I don't need to bother with compiling on Windows then.

Quote:
What did you changed from the last patch?

Not much, mostly copy and paste work into right places, using the previous patches.
Also I didn't patch the eepro100 card as the code changed so much that it didn't make any sense to me.....I remember this card is used in Juniper so please somebody test multicast on it.

Quote:
can you make it cover the monitor area as well for the hot link add/remove!

I will definitively try....


Top
 Profile  
 
 Post subject: Re: Patch for Qemu 0.13.0
PostPosted: Tue Dec 28, 2010 3:06 pm 
Offline
Site Admin

Joined: Sat Oct 11, 2008 1:41 pm
Posts: 2668
Location: Canada
Code:
Also I didn't patch the eepro100 card as the code changed so much that it didn't make any sense to me


I had a look at the eepro100 code, I would say it now supports multicast but someone should really try ;)

I'll wait that we are sure this version of Qemu is working correctly then I'll post the links on gns3.net.

Cheers,



_________________
Jeremy, GNS3 Programmer & Benevolent Dictator for Life.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 26 posts ]  Go to page 1, 2, 3  Next

All times are UTC


Who is online

Users browsing this forum: No registered users and 0 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group

phpBB SEO