summaryrefslogtreecommitdiff
path: root/cisco/qemu-mcast/qemu-0.14.1-multicast.patch
diff options
context:
space:
mode:
Diffstat (limited to 'cisco/qemu-mcast/qemu-0.14.1-multicast.patch')
-rw-r--r--cisco/qemu-mcast/qemu-0.14.1-multicast.patch291
1 files changed, 291 insertions, 0 deletions
diff --git a/cisco/qemu-mcast/qemu-0.14.1-multicast.patch b/cisco/qemu-mcast/qemu-0.14.1-multicast.patch
new file mode 100644
index 0000000..fb46465
--- /dev/null
+++ b/cisco/qemu-mcast/qemu-0.14.1-multicast.patch
@@ -0,0 +1,291 @@
+diff -uNr old-qemu-0.14.1//block/raw-win32.c qemu-0.14.1/block/raw-win32.c
+--- old-qemu-0.14.1//block/raw-win32.c 2011-05-06 21:01:43.000000000 +0200
++++ qemu-0.14.1/block/raw-win32.c 2011-05-11 15:41:45.744749392 +0200
+@@ -93,7 +93,7 @@
+ else if (!(flags & BDRV_O_CACHE_WB))
+ overlapped |= FILE_FLAG_WRITE_THROUGH;
+ s->hfile = CreateFile(filename, access_flags,
+- FILE_SHARE_READ, NULL,
++ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, overlapped, NULL);
+ if (s->hfile == INVALID_HANDLE_VALUE) {
+ int err = GetLastError();
+@@ -354,7 +354,7 @@
+ else if (!(flags & BDRV_O_CACHE_WB))
+ overlapped |= FILE_FLAG_WRITE_THROUGH;
+ s->hfile = CreateFile(filename, access_flags,
+- FILE_SHARE_READ, NULL,
++ FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
+ create_flags, overlapped, NULL);
+ if (s->hfile == INVALID_HANDLE_VALUE) {
+ int err = GetLastError();
+diff -uNr old-qemu-0.14.1//hw/e1000.c qemu-0.14.1/hw/e1000.c
+--- old-qemu-0.14.1//hw/e1000.c 2011-05-06 21:01:43.000000000 +0200
++++ qemu-0.14.1/hw/e1000.c 2011-05-11 15:41:45.744749392 +0200
+@@ -573,7 +573,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 -uNr old-qemu-0.14.1//Makefile.objs qemu-0.14.1/Makefile.objs
+--- old-qemu-0.14.1//Makefile.objs 2011-05-06 21:01:43.000000000 +0200
++++ qemu-0.14.1/Makefile.objs 2011-05-11 15:41:45.751749392 +0200
+@@ -34,6 +34,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 -uNr old-qemu-0.14.1//net/udp.c qemu-0.14.1/net/udp.c
+--- old-qemu-0.14.1//net/udp.c 1970-01-01 01:00:00.000000000 +0100
++++ qemu-0.14.1/net/udp.c 2011-05-11 15:41:45.752749392 +0200
+@@ -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 -uNr old-qemu-0.14.1//net/udp.h qemu-0.14.1/net/udp.h
+--- old-qemu-0.14.1//net/udp.h 1970-01-01 01:00:00.000000000 +0100
++++ qemu-0.14.1/net/udp.h 2011-05-11 15:41:45.752749392 +0200
+@@ -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 -uNr old-qemu-0.14.1//net.c qemu-0.14.1/net.c
+--- old-qemu-0.14.1//net.c 2011-05-06 21:01:44.000000000 +0200
++++ qemu-0.14.1/net.c 2011-05-11 15:42:53.145749408 +0200
+@@ -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"
+@@ -1085,9 +1086,31 @@
+ .help = "permissions for socket",
+ },
+ { /* end of list */ }
+- },
++ },
+ #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 -uNr old-qemu-0.14.1//net.h qemu-0.14.1/net.h
+--- old-qemu-0.14.1//net.h 2011-05-06 21:01:44.000000000 +0200
++++ qemu-0.14.1/net.h 2011-05-11 15:41:45.754749392 +0200
+@@ -35,6 +35,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 -uNr old-qemu-0.14.1//qemu-options.hx qemu-0.14.1/qemu-options.hx
+--- old-qemu-0.14.1//qemu-options.hx 2011-05-06 21:01:44.000000000 +0200
++++ qemu-0.14.1/qemu-options.hx 2011-05-11 15:41:45.755749392 +0200
+@@ -1070,6 +1070,8 @@
+ "-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 udp[,vlan=n]sport=sport,dport=dport,daddr=host\n"
++ " connect the vlan 'n' to a UDP tunnel (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"
+
+