SOURCES: VMware-player-vmnet.patch (NEW) - allow build on 2.6.25.14
andree
andree at pld-linux.org
Sat Aug 30 19:03:26 CEST 2008
Author: andree Date: Sat Aug 30 17:03:26 2008 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- allow build on 2.6.25.14
---- Files affected:
SOURCES:
VMware-player-vmnet.patch (NONE -> 1.1) (NEW)
---- Diffs:
================================================================
Index: SOURCES/VMware-player-vmnet.patch
diff -u /dev/null SOURCES/VMware-player-vmnet.patch:1.1
--- /dev/null Sat Aug 30 19:03:26 2008
+++ SOURCES/VMware-player-vmnet.patch Sat Aug 30 19:03:20 2008
@@ -0,0 +1,1748 @@
+diff -Nur old/vmware-any-any-update117d/vmnet-only/bridge.c new/vmware-any-any-update117d/vmnet-only/bridge.c
+--- old/vmware-any-any-update117d/vmnet-only/bridge.c 2008-08-30 15:50:06.800648000 +0000
++++ new/vmware-any-any-update117d/vmnet-only/bridge.c 2008-08-30 16:10:34.153352750 +0000
+@@ -275,7 +275,7 @@
+ struct net_device *net) // IN: Network device
+ {
+ #ifdef VMW_NETDEV_HAS_NET
+- if (dev_net(net) != dev_net(bridge->internalDev)) {
++ if (net->nd_net != bridge->internalDev->nd_net) {
+ return 0;
+ }
+ #endif
+diff -Nur old/vmware-any-any-update117d/vmnet-only/bridge.c~ new/vmware-any-any-update117d/vmnet-only/bridge.c~
+--- old/vmware-any-any-update117d/vmnet-only/bridge.c~ 1970-01-01 00:00:00.000000000 +0000
++++ new/vmware-any-any-update117d/vmnet-only/bridge.c~ 2008-08-30 15:57:32.192483250 +0000
+@@ -0,0 +1,1550 @@
++/* **********************************************************
++ * Copyright 1998 VMware, Inc. All rights reserved. -- VMware Confidential
++ * **********************************************************/
++
++#include "driver-config.h"
++
++#define EXPORT_SYMTAB
++
++#include <linux/kernel.h>
++#include <linux/version.h>
++#include <linux/sched.h>
++#ifdef KERNEL_2_2
++# include <linux/slab.h>
++#else
++# include <linux/malloc.h>
++#endif
++#include <linux/poll.h>
++
++#include <linux/netdevice.h>
++#include <linux/etherdevice.h>
++#include <linux/mm.h>
++#include "compat_skbuff.h"
++#include <linux/sockios.h>
++#include "compat_sock.h"
++
++#define __KERNEL_SYSCALLS__
++#include <asm/io.h>
++
++#include <linux/proc_fs.h>
++#include <linux/file.h>
++#include <linux/ip.h>
++#include <linux/tcp.h>
++#include <net/tcp.h>
++
++#ifdef CONFIG_NET_RADIO
++# include <linux/wireless.h>
++#endif
++#include "vmnetInt.h"
++#include "compat_spinlock.h"
++#include "compat_netdevice.h"
++#include "vnetInt.h"
++#include "smac.h"
++
++#define VNET_BRIDGE_HISTORY 48
++
++/*
++ * Bytes reserved before start of packet. As Ethernet header has 14 bytes,
++ * to get aligned IP header we must skip 2 bytes before packet. Not that it
++ * matters a lot for us, but using 2 is compatible with what newer 2.6.x
++ * kernels do.
++ */
++#ifndef NET_IP_ALIGN
++#define NET_IP_ALIGN 2
++#endif
++
++#if LOGLEVEL >= 4
++static struct timeval vnetTime;
++#endif
++
++typedef struct VNetBridge VNetBridge;
++
++struct VNetBridge {
++ struct notifier_block notifier; // for device state changes
++ char name[VNET_NAME_LEN]; // name of net device (e.g., "eth0")
++ struct net_device *dev; // device structure for 'name'
++ struct sock *sk; // socket associated with skb's
++ struct packet_type pt; // used to add packet handler
++ Bool enabledPromisc; // track if promisc enabled
++ Bool warnPromisc; // tracks if warning has been logged
++ struct sk_buff *history[VNET_BRIDGE_HISTORY]; // avoid duplicate packets
++ spinlock_t historyLock; // protects 'history'
++ VNetPort port; // connection to virtual hub
++ Bool wirelessAdapter; // connected to wireless adapter?
++ struct SMACState *smac; // device structure for wireless
++#ifdef VMW_NETDEV_HAS_NET
++ struct net_device *internalDev;
++#endif
++};
++
++typedef PacketStatus (* SMACINT SMACFunc)(struct SMACState *, SMACPackets *);
++
++static int VNetBridgeUp(VNetBridge *bridge, Bool rtnlLock);
++static void VNetBridgeDown(VNetBridge *bridge, Bool rtnlLock);
++
++static int VNetBridgeNotify(struct notifier_block *this, u_long msg,
++ void *data);
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 14) && \
++ !defined(VMW_TL10S64_WORKAROUND)
++static int VNetBridgeReceiveFromDev(struct sk_buff *skb,
++ struct net_device *dev,
++ struct packet_type *pt);
++#else
++static int VNetBridgeReceiveFromDev(struct sk_buff *skb,
++ struct net_device *dev,
++ struct packet_type *pt,
++ struct net_device *real_dev);
++#endif
++
++static void VNetBridgeFree(VNetJack *this);
++static void VNetBridgeReceiveFromVNet(VNetJack *this, struct sk_buff *skb);
++static Bool VNetBridgeCycleDetect(VNetJack *this, int generation);
++static Bool VNetBridgeIsDeviceWireless(struct net_device *dev);
++static void VNetBridgePortsChanged(VNetJack *this);
++static int VNetBridgeIsBridged(VNetJack *this);
++static int VNetBridgeProcRead(char *page, char **start, off_t off,
++ int count, int *eof, void *data);
++
++
++/*
++ *----------------------------------------------------------------------
++ *
++ * VNetBridgeStartPromisc --
++ *
++ * Set IFF_PROMISC on the peer interface.
++ *
++ * Results:
++ * None.
++ *
++ * Side effects:
++ * The peer interface IFF_PROMISC flag may be changed.
++ *
++ *----------------------------------------------------------------------
++ */
++
++static void
++VNetBridgeStartPromisc(VNetBridge *bridge, // IN:
++ Bool rtnlLock) // IN: Acquire RTNL lock
++{
++ struct net_device *dev = bridge->dev;
++
++ /*
++ * Disable wireless cards from going into promiscous mode because those
++ * cards which do support RF monitoring would not be able to function
++ * correctly i.e. they would not be able to send data packets.
++ */
++ if (rtnlLock) {
++ rtnl_lock();
++ }
++ if (!bridge->enabledPromisc && !bridge->wirelessAdapter) {
++ dev_set_promiscuity(dev, 1);
++ bridge->enabledPromisc = TRUE;
++ bridge->warnPromisc = FALSE;
++ LOG(0, (KERN_NOTICE "bridge-%s: enabled promiscuous mode\n",
++ bridge->name));
++ }
++ if (rtnlLock) {
++ rtnl_unlock();
++ }
++}
++
++
++/*
++ *----------------------------------------------------------------------
++ *
++ * VNetBridgeStopPromisc --
++ *
++ * Restore saved IFF_PROMISC on the peer interface.
++ *
++ * Results:
++ * None.
++ *
++ * Side effects:
++ * The peer interface IFF_PROMISC flag may be changed.
++ *
++ *----------------------------------------------------------------------
++ */
++
++static void
++VNetBridgeStopPromisc(VNetBridge *bridge, // IN:
++ Bool rtnlLock) // IN: Acquire RTNL lock
++{
++ struct net_device *dev = bridge->dev;
++
++ if (rtnlLock) {
++ rtnl_lock();
++ }
++ if (bridge->enabledPromisc && !bridge->wirelessAdapter) {
++ dev_set_promiscuity(dev, -1);
++ bridge->enabledPromisc = FALSE;
++ LOG(0, (KERN_NOTICE "bridge-%s: disabled promiscuous mode\n",
++ bridge->name));
++ }
++ if (rtnlLock) {
++ rtnl_unlock();
++ }
++}
++
++
++/*
++ *----------------------------------------------------------------------
++ *
++ * VNetBridgeCheckPromisc --
++ *
++ * Make sure IFF_PROMISC on the peer interface is set.
++ *
++ * This can be called periodically.
++ *
++ * Results:
++ * None.
++ *
++ * Side effects:
++ * Hopefully enables promiscuous mode again if it should have been enabled.
++ *
++ *----------------------------------------------------------------------
++ */
++
++static INLINE_SINGLE_CALLER void
++VNetBridgeCheckPromisc(VNetBridge *bridge)
++{
++#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)
++ if (bridge->enabledPromisc && !bridge->wirelessAdapter) {
++ struct net_device *dev = bridge->dev;
++ Bool devPromisc = (dev->flags & IFF_PROMISC) != 0;
++
++ if (!devPromisc) {
++ if (!bridge->warnPromisc) {
++ bridge->warnPromisc = TRUE;
++ LOG(0, (KERN_NOTICE "bridge-%s: someone disabled promiscuous mode\n"
++ "Your Ethernet driver is not compatible with VMware's bridged networking.\n",
++ bridge->name));
++ }
++ rtnl_lock();
++ dev_set_promiscuity(dev, 0);
++ rtnl_unlock();
++ }
++ }
++#endif
++}
++
++
++#ifdef VMW_NETDEV_HAS_NET
++/*
++ *----------------------------------------------------------------------
++ *
++ * VNetBridgeInternalSetup --
++ *
++ * Setup callback for our bridge internal device. Nothing to do,
++ * generic code sets up everything we expect from device.
++ *
++ * Results:
++ * None.
++ *
++ * Side effects:
++ * None.
++ *
++ *----------------------------------------------------------------------
++ */
++
++static void
++VNetBridgeInternalSetup(struct net_device *net)
++{
++ /* Do nothing. */
++}
++#endif
++
++
++/*
++ *----------------------------------------------------------------------
++ *
++ * VNetBridgeDevCompatible --
++ *
++ * Check whether bridge and network device are compatible.
++ *
++ * Results:
++ * Non-zero if device is good enough for bridge. Zero otherwise.
++ *
++ * Side effects:
++ * None.
++ *
++ *----------------------------------------------------------------------
++ */
++
++static INLINE_SINGLE_CALLER int
++VNetBridgeDevCompatible(VNetBridge *bridge, // IN: Bridge
++ struct net_device *net) // IN: Network device
++{
++#ifdef VMW_NETDEV_HAS_NET
++ if (net->nd_net != bridge->internalDev->nd_net)) {
++ return 0;
++ }
++#endif
++ return strcmp(net->name, bridge->name) == 0;
++}
++
++
++/*
++ *----------------------------------------------------------------------
++ *
++ * VNetBridge_Create --
++ *
++ * Create a bridge. Allocates/initializes struct, registers
++ * with kernel for device state changes, connects to virtual
++ * hub, initializes port/jack, and creates a proc entry.
++ *
++ * Results:
++ * Errno. Also returns an allocated jack to connect to,
++ * NULL on error.
++ *
++ * Side effects:
++ * None.
++ *
++ *----------------------------------------------------------------------
++ */
++
++int
++VNetBridge_Create(char *devName, // IN: name of device (e.g., "eth0")
++ VNetPort **ret) // OUT: port to virtual hub
++{
++ VNetBridge *bridge = NULL;
++ static unsigned id = 0;
++ int retval = 0;
++
++ *ret = NULL;
++
++ /*
++ * Its an error if device name is empty.
++ */
++
++ if (devName[0] == '\0') {
++ retval = -EINVAL;
++ goto out;
++ }
++
++ /*
++ * Allocate bridge structure
++ */
++
++ bridge = kmalloc(sizeof *bridge, GFP_USER);
++ if (bridge == NULL) {
++ retval = -ENOMEM;
++ goto out;
++ }
++ memset(bridge, 0, sizeof *bridge);
++ spin_lock_init(&bridge->historyLock);
++ memcpy(bridge->name, devName, sizeof bridge->name);
++ NULL_TERMINATE_STRING(bridge->name);
++
++#ifdef VMW_NETDEV_HAS_NET
++ bridge->internalDev = compat_alloc_netdev(0, "vmnetX", VNetBridgeInternalSetup);
++ if (!bridge->internalDev) {
++ retval = -ENOMEM;
++ goto out;
++ }
++#endif
++
++ /*
++ * Set up notifier for network device state change
++ */
++
++ bridge->notifier.notifier_call = VNetBridgeNotify;
++ bridge->notifier.priority = 0;
++ register_netdevice_notifier(&bridge->notifier);
++
++ /*
++ * Try to bring it up
++ */
++
++ retval = VNetBridgeUp(bridge, TRUE);
++ if (retval == -ENODEV) {
++ LOG(1, (KERN_DEBUG "bridge-%s: peer interface %s not found, "
++ "will wait for it to come up\n",
++ bridge->name, devName));
++ retval = 0;
++ }
++ if (retval != 0) {
++ goto out;
++ }
++
++ /*
++ * Initialize jack
++ */
++
++ bridge->port.id = id++;
++ bridge->port.next = NULL;
++
++ bridge->port.jack.peer = NULL;
++ bridge->port.jack.numPorts = 1;
++ VNetSnprintf(bridge->port.jack.name, sizeof bridge->port.jack.name,
++ "bridge%u", bridge->port.id);
++ bridge->port.jack.private = bridge;
++ bridge->port.jack.index = 0;
++ bridge->port.jack.procEntry = NULL;
++ bridge->port.jack.free = VNetBridgeFree;
++ bridge->port.jack.rcv = VNetBridgeReceiveFromVNet;
++ bridge->port.jack.cycleDetect = VNetBridgeCycleDetect;
++ bridge->port.jack.portsChanged = VNetBridgePortsChanged;
++ bridge->port.jack.isBridged = VNetBridgeIsBridged;
++
++ /*
++ * Make proc entry for this jack.
++ */
++
++ retval = VNetProc_MakeEntry(NULL, bridge->port.jack.name, S_IFREG,
++ &bridge->port.jack.procEntry);
++ if (retval) {
++ if (retval == -ENXIO) {
++ bridge->port.jack.procEntry = NULL;
++ } else {
++ goto out;
++ }
++ } else {
++ bridge->port.jack.procEntry->read_proc = VNetBridgeProcRead;
++ bridge->port.jack.procEntry->data = bridge;
++ }
++
++ /*
++ * Rest of fields.
++ */
++
++ bridge->port.flags = IFF_RUNNING;
++
++ memset(bridge->port.paddr, 0, sizeof bridge->port.paddr);
++ memset(bridge->port.ladrf, 0, sizeof bridge->port.ladrf);
++
++ bridge->port.paddr[0] = VMX86_STATIC_OUI0;
++ bridge->port.paddr[1] = VMX86_STATIC_OUI1;
++ bridge->port.paddr[2] = VMX86_STATIC_OUI2;
++
++ bridge->port.fileOpRead = NULL;
++ bridge->port.fileOpWrite = NULL;
++ bridge->port.fileOpIoctl = NULL;
++ bridge->port.fileOpPoll = NULL;
++
++ *ret = &bridge->port;
++
++ LOG(1, (KERN_DEBUG "bridge-%s: attached\n", bridge->name));
++ return 0;
++
++out:
++ if (bridge != NULL) {
++ if (bridge->notifier.notifier_call != NULL) {
++ unregister_netdevice_notifier(&bridge->notifier);
++ }
++#ifdef VMW_NETDEV_HAS_NET
++ if (bridge->internalDev) {
++ compat_free_netdev(bridge->internalDev);
++ }
++#endif
++ kfree(bridge);
++ }
++ return retval;
++}
++
++
++/*
++ *----------------------------------------------------------------------
++ *
++ * VNetBridgeFree --
++ *
++ * Disconnect the bridge, unregister from device state
++ * notifications, remove proc entry, and deallocate struct.
++ *
++ * Results:
++ * None.
++ *
++ * Side effects:
++ * None.
++ *
++ *----------------------------------------------------------------------
++ */
++
++void
++VNetBridgeFree(VNetJack *this) // IN: jack to free
++{
++ VNetBridge *bridge = (VNetBridge*)this->private;
++
++ if (bridge->dev != NULL) {
++ VNetBridgeDown(bridge, TRUE);
++ }
++
++ unregister_netdevice_notifier(&bridge->notifier);
++
++#ifdef VMW_NETDEV_HAS_NET
++ if (bridge->internalDev) {
++ compat_free_netdev(bridge->internalDev);
++ }
++#endif
++
++ if (this->procEntry) {
++ VNetProc_RemoveEntry(this->procEntry, NULL);
++ }
++
++ if (bridge->smac){
++ SMAC_CleanupState(&(bridge->smac));
++ }
++
++ LOG(1, (KERN_DEBUG "bridge-%s: detached\n", bridge->name));
++ kfree(bridge);
++}
++
++
++/*
++ *----------------------------------------------------------------------
++ *
++ * VNetCallSMACFunc --
++ *
++ * Wrapper for SMAC functions.
++ *
++ * Results:
++ * Packet Status.
++ *
++ * Side effects:
++ * The skb buffer is freed if not succesfull otherwise it points to
++ * the clone.
++ *
++ *----------------------------------------------------------------------
++ */
++
++PacketStatus
++VNetCallSMACFunc(struct SMACState *state, // IN: pointer to state
++ struct sk_buff **skb, // IN/OUT: packet to process
++ void *startOfData, // IN: points to start of data
++ SMACFunc func) // IN: function to be called
++{
++ SMACPackets packets = { {0} };
++ PacketStatus status;
++
++ packets.orig.skb = *skb;
++ packets.orig.startOfData = startOfData;
++
++ status = func(state, &packets);
++ if (status != PacketStatusForwardPacket) {
++ dev_kfree_skb(*skb);
++ return status;
++ }
++
++ if (packets.clone.skb) {
++ dev_kfree_skb(*skb);
++ *skb = packets.clone.skb;
++ }
++ return status;
++}
++
++
++/*
++ *----------------------------------------------------------------------
++ *
++ * VNetBridgeReceiveFromVNet --
++ *
++ * This jack is receiving a packet from a vnet. This function
++ * sends down (i.e., out on the host net device) if the packet
++ * isn't destined for the host, and it sends up (i.e.,
++ * simulates a receive for the host) if the packet
++ * satisfies the host's packet filter.
++ *
++ * When the function sends up it keeps a reference to the
++ * packet in a history list so that we can avoid handing
++ * a VM a copy of its own packet.
++ *
++ * Results:
++ * None.
++ *
++ * Side effects:
++ * Frees skb. Checks if host device is still using
++ * promiscuous mode.
++ *
++ *----------------------------------------------------------------------
++ */
++
++void
++VNetBridgeReceiveFromVNet(VNetJack *this, // IN: jack
++ struct sk_buff *skb) // IN: pkt to receive
++{
++ VNetBridge *bridge = (VNetBridge*)this->private;
++ struct net_device *dev = bridge->dev;
++ uint8 dest[ETH_ALEN];
++ struct sk_buff *clone;
++
++ LOG(3, (KERN_DEBUG "bridge-%s: transmit %d\n",
++ bridge->name, (int) skb->len));
++
++ if (!dev) {
++ dev_kfree_skb(skb);
++ return;
++ }
<<Diff was trimmed, longer than 597 lines>>
More information about the pld-cvs-commit
mailing list