diff options
Diffstat (limited to 'cisco/qemu-mcast/qemu-0.14.1-multicast.patch')
-rw-r--r-- | cisco/qemu-mcast/qemu-0.14.1-multicast.patch | 291 |
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" + + |