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