1 diff -Nur old/vmware-any-any-update117d/vmnet-only/bridge.c new/vmware-any-any-update117d/vmnet-only/bridge.c
2 --- old/vmware-any-any-update117d/vmnet-only/bridge.c 2008-08-30 15:50:06.800648000 +0000
3 +++ new/vmware-any-any-update117d/vmnet-only/bridge.c 2008-08-30 16:10:34.153352750 +0000
5 struct net_device *net) // IN: Network device
7 #ifdef VMW_NETDEV_HAS_NET
8 - if (dev_net(net) != dev_net(bridge->internalDev)) {
9 + if (net->nd_net != bridge->internalDev->nd_net) {
13 diff -Nur old/vmware-any-any-update117d/vmnet-only/bridge.c~ new/vmware-any-any-update117d/vmnet-only/bridge.c~
14 --- old/vmware-any-any-update117d/vmnet-only/bridge.c~ 1970-01-01 00:00:00.000000000 +0000
15 +++ new/vmware-any-any-update117d/vmnet-only/bridge.c~ 2008-08-30 15:57:32.192483250 +0000
17 +/* **********************************************************
18 + * Copyright 1998 VMware, Inc. All rights reserved. -- VMware Confidential
19 + * **********************************************************/
21 +#include "driver-config.h"
23 +#define EXPORT_SYMTAB
25 +#include <linux/kernel.h>
26 +#include <linux/version.h>
27 +#include <linux/sched.h>
29 +# include <linux/slab.h>
31 +# include <linux/malloc.h>
33 +#include <linux/poll.h>
35 +#include <linux/netdevice.h>
36 +#include <linux/etherdevice.h>
37 +#include <linux/mm.h>
38 +#include "compat_skbuff.h"
39 +#include <linux/sockios.h>
40 +#include "compat_sock.h"
42 +#define __KERNEL_SYSCALLS__
45 +#include <linux/proc_fs.h>
46 +#include <linux/file.h>
47 +#include <linux/ip.h>
48 +#include <linux/tcp.h>
51 +#ifdef CONFIG_NET_RADIO
52 +# include <linux/wireless.h>
54 +#include "vmnetInt.h"
55 +#include "compat_spinlock.h"
56 +#include "compat_netdevice.h"
60 +#define VNET_BRIDGE_HISTORY 48
63 + * Bytes reserved before start of packet. As Ethernet header has 14 bytes,
64 + * to get aligned IP header we must skip 2 bytes before packet. Not that it
65 + * matters a lot for us, but using 2 is compatible with what newer 2.6.x
69 +#define NET_IP_ALIGN 2
73 +static struct timeval vnetTime;
76 +typedef struct VNetBridge VNetBridge;
79 + struct notifier_block notifier; // for device state changes
80 + char name[VNET_NAME_LEN]; // name of net device (e.g., "eth0")
81 + struct net_device *dev; // device structure for 'name'
82 + struct sock *sk; // socket associated with skb's
83 + struct packet_type pt; // used to add packet handler
84 + Bool enabledPromisc; // track if promisc enabled
85 + Bool warnPromisc; // tracks if warning has been logged
86 + struct sk_buff *history[VNET_BRIDGE_HISTORY]; // avoid duplicate packets
87 + spinlock_t historyLock; // protects 'history'
88 + VNetPort port; // connection to virtual hub
89 + Bool wirelessAdapter; // connected to wireless adapter?
90 + struct SMACState *smac; // device structure for wireless
91 +#ifdef VMW_NETDEV_HAS_NET
92 + struct net_device *internalDev;
96 +typedef PacketStatus (* SMACINT SMACFunc)(struct SMACState *, SMACPackets *);
98 +static int VNetBridgeUp(VNetBridge *bridge, Bool rtnlLock);
99 +static void VNetBridgeDown(VNetBridge *bridge, Bool rtnlLock);
101 +static int VNetBridgeNotify(struct notifier_block *this, u_long msg,
103 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 14) && \
104 + !defined(VMW_TL10S64_WORKAROUND)
105 +static int VNetBridgeReceiveFromDev(struct sk_buff *skb,
106 + struct net_device *dev,
107 + struct packet_type *pt);
109 +static int VNetBridgeReceiveFromDev(struct sk_buff *skb,
110 + struct net_device *dev,
111 + struct packet_type *pt,
112 + struct net_device *real_dev);
115 +static void VNetBridgeFree(VNetJack *this);
116 +static void VNetBridgeReceiveFromVNet(VNetJack *this, struct sk_buff *skb);
117 +static Bool VNetBridgeCycleDetect(VNetJack *this, int generation);
118 +static Bool VNetBridgeIsDeviceWireless(struct net_device *dev);
119 +static void VNetBridgePortsChanged(VNetJack *this);
120 +static int VNetBridgeIsBridged(VNetJack *this);
121 +static int VNetBridgeProcRead(char *page, char **start, off_t off,
122 + int count, int *eof, void *data);
126 + *----------------------------------------------------------------------
128 + * VNetBridgeStartPromisc --
130 + * Set IFF_PROMISC on the peer interface.
136 + * The peer interface IFF_PROMISC flag may be changed.
138 + *----------------------------------------------------------------------
142 +VNetBridgeStartPromisc(VNetBridge *bridge, // IN:
143 + Bool rtnlLock) // IN: Acquire RTNL lock
145 + struct net_device *dev = bridge->dev;
148 + * Disable wireless cards from going into promiscous mode because those
149 + * cards which do support RF monitoring would not be able to function
150 + * correctly i.e. they would not be able to send data packets.
155 + if (!bridge->enabledPromisc && !bridge->wirelessAdapter) {
156 + dev_set_promiscuity(dev, 1);
157 + bridge->enabledPromisc = TRUE;
158 + bridge->warnPromisc = FALSE;
159 + LOG(0, (KERN_NOTICE "bridge-%s: enabled promiscuous mode\n",
169 + *----------------------------------------------------------------------
171 + * VNetBridgeStopPromisc --
173 + * Restore saved IFF_PROMISC on the peer interface.
179 + * The peer interface IFF_PROMISC flag may be changed.
181 + *----------------------------------------------------------------------
185 +VNetBridgeStopPromisc(VNetBridge *bridge, // IN:
186 + Bool rtnlLock) // IN: Acquire RTNL lock
188 + struct net_device *dev = bridge->dev;
193 + if (bridge->enabledPromisc && !bridge->wirelessAdapter) {
194 + dev_set_promiscuity(dev, -1);
195 + bridge->enabledPromisc = FALSE;
196 + LOG(0, (KERN_NOTICE "bridge-%s: disabled promiscuous mode\n",
206 + *----------------------------------------------------------------------
208 + * VNetBridgeCheckPromisc --
210 + * Make sure IFF_PROMISC on the peer interface is set.
212 + * This can be called periodically.
218 + * Hopefully enables promiscuous mode again if it should have been enabled.
220 + *----------------------------------------------------------------------
223 +static INLINE_SINGLE_CALLER void
224 +VNetBridgeCheckPromisc(VNetBridge *bridge)
226 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0)
227 + if (bridge->enabledPromisc && !bridge->wirelessAdapter) {
228 + struct net_device *dev = bridge->dev;
229 + Bool devPromisc = (dev->flags & IFF_PROMISC) != 0;
232 + if (!bridge->warnPromisc) {
233 + bridge->warnPromisc = TRUE;
234 + LOG(0, (KERN_NOTICE "bridge-%s: someone disabled promiscuous mode\n"
235 + "Your Ethernet driver is not compatible with VMware's bridged networking.\n",
239 + dev_set_promiscuity(dev, 0);
247 +#ifdef VMW_NETDEV_HAS_NET
249 + *----------------------------------------------------------------------
251 + * VNetBridgeInternalSetup --
253 + * Setup callback for our bridge internal device. Nothing to do,
254 + * generic code sets up everything we expect from device.
262 + *----------------------------------------------------------------------
266 +VNetBridgeInternalSetup(struct net_device *net)
274 + *----------------------------------------------------------------------
276 + * VNetBridgeDevCompatible --
278 + * Check whether bridge and network device are compatible.
281 + * Non-zero if device is good enough for bridge. Zero otherwise.
286 + *----------------------------------------------------------------------
289 +static INLINE_SINGLE_CALLER int
290 +VNetBridgeDevCompatible(VNetBridge *bridge, // IN: Bridge
291 + struct net_device *net) // IN: Network device
293 +#ifdef VMW_NETDEV_HAS_NET
294 + if (net->nd_net != bridge->internalDev->nd_net)) {
298 + return strcmp(net->name, bridge->name) == 0;
303 + *----------------------------------------------------------------------
305 + * VNetBridge_Create --
307 + * Create a bridge. Allocates/initializes struct, registers
308 + * with kernel for device state changes, connects to virtual
309 + * hub, initializes port/jack, and creates a proc entry.
312 + * Errno. Also returns an allocated jack to connect to,
318 + *----------------------------------------------------------------------
322 +VNetBridge_Create(char *devName, // IN: name of device (e.g., "eth0")
323 + VNetPort **ret) // OUT: port to virtual hub
325 + VNetBridge *bridge = NULL;
326 + static unsigned id = 0;
332 + * Its an error if device name is empty.
335 + if (devName[0] == '\0') {
341 + * Allocate bridge structure
344 + bridge = kmalloc(sizeof *bridge, GFP_USER);
345 + if (bridge == NULL) {
349 + memset(bridge, 0, sizeof *bridge);
350 + spin_lock_init(&bridge->historyLock);
351 + memcpy(bridge->name, devName, sizeof bridge->name);
352 + NULL_TERMINATE_STRING(bridge->name);
354 +#ifdef VMW_NETDEV_HAS_NET
355 + bridge->internalDev = compat_alloc_netdev(0, "vmnetX", VNetBridgeInternalSetup);
356 + if (!bridge->internalDev) {
363 + * Set up notifier for network device state change
366 + bridge->notifier.notifier_call = VNetBridgeNotify;
367 + bridge->notifier.priority = 0;
368 + register_netdevice_notifier(&bridge->notifier);
371 + * Try to bring it up
374 + retval = VNetBridgeUp(bridge, TRUE);
375 + if (retval == -ENODEV) {
376 + LOG(1, (KERN_DEBUG "bridge-%s: peer interface %s not found, "
377 + "will wait for it to come up\n",
378 + bridge->name, devName));
389 + bridge->port.id = id++;
390 + bridge->port.next = NULL;
392 + bridge->port.jack.peer = NULL;
393 + bridge->port.jack.numPorts = 1;
394 + VNetSnprintf(bridge->port.jack.name, sizeof bridge->port.jack.name,
395 + "bridge%u", bridge->port.id);
396 + bridge->port.jack.private = bridge;
397 + bridge->port.jack.index = 0;
398 + bridge->port.jack.procEntry = NULL;
399 + bridge->port.jack.free = VNetBridgeFree;
400 + bridge->port.jack.rcv = VNetBridgeReceiveFromVNet;
401 + bridge->port.jack.cycleDetect = VNetBridgeCycleDetect;
402 + bridge->port.jack.portsChanged = VNetBridgePortsChanged;
403 + bridge->port.jack.isBridged = VNetBridgeIsBridged;
406 + * Make proc entry for this jack.
409 + retval = VNetProc_MakeEntry(NULL, bridge->port.jack.name, S_IFREG,
410 + &bridge->port.jack.procEntry);
412 + if (retval == -ENXIO) {
413 + bridge->port.jack.procEntry = NULL;
418 + bridge->port.jack.procEntry->read_proc = VNetBridgeProcRead;
419 + bridge->port.jack.procEntry->data = bridge;
426 + bridge->port.flags = IFF_RUNNING;
428 + memset(bridge->port.paddr, 0, sizeof bridge->port.paddr);
429 + memset(bridge->port.ladrf, 0, sizeof bridge->port.ladrf);
431 + bridge->port.paddr[0] = VMX86_STATIC_OUI0;
432 + bridge->port.paddr[1] = VMX86_STATIC_OUI1;
433 + bridge->port.paddr[2] = VMX86_STATIC_OUI2;
435 + bridge->port.fileOpRead = NULL;
436 + bridge->port.fileOpWrite = NULL;
437 + bridge->port.fileOpIoctl = NULL;
438 + bridge->port.fileOpPoll = NULL;
440 + *ret = &bridge->port;
442 + LOG(1, (KERN_DEBUG "bridge-%s: attached\n", bridge->name));
446 + if (bridge != NULL) {
447 + if (bridge->notifier.notifier_call != NULL) {
448 + unregister_netdevice_notifier(&bridge->notifier);
450 +#ifdef VMW_NETDEV_HAS_NET
451 + if (bridge->internalDev) {
452 + compat_free_netdev(bridge->internalDev);
462 + *----------------------------------------------------------------------
464 + * VNetBridgeFree --
466 + * Disconnect the bridge, unregister from device state
467 + * notifications, remove proc entry, and deallocate struct.
475 + *----------------------------------------------------------------------
479 +VNetBridgeFree(VNetJack *this) // IN: jack to free
481 + VNetBridge *bridge = (VNetBridge*)this->private;
483 + if (bridge->dev != NULL) {
484 + VNetBridgeDown(bridge, TRUE);
487 + unregister_netdevice_notifier(&bridge->notifier);
489 +#ifdef VMW_NETDEV_HAS_NET
490 + if (bridge->internalDev) {
491 + compat_free_netdev(bridge->internalDev);
495 + if (this->procEntry) {
496 + VNetProc_RemoveEntry(this->procEntry, NULL);
500 + SMAC_CleanupState(&(bridge->smac));
503 + LOG(1, (KERN_DEBUG "bridge-%s: detached\n", bridge->name));
509 + *----------------------------------------------------------------------
511 + * VNetCallSMACFunc --
513 + * Wrapper for SMAC functions.
519 + * The skb buffer is freed if not succesfull otherwise it points to
522 + *----------------------------------------------------------------------
526 +VNetCallSMACFunc(struct SMACState *state, // IN: pointer to state
527 + struct sk_buff **skb, // IN/OUT: packet to process
528 + void *startOfData, // IN: points to start of data
529 + SMACFunc func) // IN: function to be called
531 + SMACPackets packets = { {0} };
532 + PacketStatus status;
534 + packets.orig.skb = *skb;
535 + packets.orig.startOfData = startOfData;
537 + status = func(state, &packets);
538 + if (status != PacketStatusForwardPacket) {
539 + dev_kfree_skb(*skb);
543 + if (packets.clone.skb) {
544 + dev_kfree_skb(*skb);
545 + *skb = packets.clone.skb;
552 + *----------------------------------------------------------------------
554 + * VNetBridgeReceiveFromVNet --
556 + * This jack is receiving a packet from a vnet. This function
557 + * sends down (i.e., out on the host net device) if the packet
558 + * isn't destined for the host, and it sends up (i.e.,
559 + * simulates a receive for the host) if the packet
560 + * satisfies the host's packet filter.
562 + * When the function sends up it keeps a reference to the
563 + * packet in a history list so that we can avoid handing
564 + * a VM a copy of its own packet.
570 + * Frees skb. Checks if host device is still using
571 + * promiscuous mode.
573 + *----------------------------------------------------------------------
577 +VNetBridgeReceiveFromVNet(VNetJack *this, // IN: jack
578 + struct sk_buff *skb) // IN: pkt to receive
580 + VNetBridge *bridge = (VNetBridge*)this->private;
581 + struct net_device *dev = bridge->dev;
582 + uint8 dest[ETH_ALEN];
583 + struct sk_buff *clone;
585 + LOG(3, (KERN_DEBUG "bridge-%s: transmit %d\n",
586 + bridge->name, (int) skb->len));
589 + dev_kfree_skb(skb);
594 + * skb might be freed by wireless code, so need to keep
595 + * a local copy of the MAC rather than a pointer to it.
598 + memcpy(dest, SKB_2_DESTMAC(skb), ETH_ALEN);
601 + * Check promiscuous bit periodically
604 + VNetBridgeCheckPromisc(bridge);
609 + * We need to send the packet both up to the host and down
610 + * to the interface.
611 + * However, we ignore packets destined only for this hub.
614 + for (i = 0; i < VNET_PORTS_PER_HUB; i++) {
615 + VNetPort *p = &port->hub->port[i];
616 + if (UP_AND_RUNNING(p->flags) && MAC_EQ(dest, p->paddr)) {
623 + * Wireless processing
626 + if (bridge->smac) {
627 + if (VNetCallSMACFunc(bridge->smac, &skb, skb->data,
628 + SMAC_CheckPacketToHost) !=
629 + PacketStatusForwardPacket) {
630 + LOG(4, (KERN_NOTICE "bridge-%s: packet dropped .\n",
637 + * Send down (imitate packet_sendmsg)
639 + * Do this only if the packet is not addressed to the peer,
640 + * and the packet size is not too big.
644 + if (MAC_EQ(dest, dev->dev_addr) ||
645 + skb->len > dev->mtu + dev->hard_header_len) {
648 +# if 0 // XXX we should do header translation
649 + if ((dev->flags & IFF_SOFTHEADERS) != 0) {
650 + if (skb->len > dev->mtu) {
653 + clone = dev_alloc_skb(skb->len + dev->hard_header_len, GFP_ATOMIC);
655 + if (clone != NULL) {
656 + skb_reserve(clone, dev->hard_header_len);
657 + if (dev->hard_header != NULL) {
658 + dev->hard_header(clone, dev, ETH_P_IP, NULL, NULL, skb->len);
660 + memcpy(skb_put(clone, skb->len), skb->data, skb->len);
664 + clone = skb_clone(skb, GFP_ATOMIC);
665 + if (clone == NULL) {
668 + struct sock *sk = bridge->sk;
669 + atomic_add(skb->truesize, &sk->sk_wmem_alloc);
671 + clone->protocol = ((struct ethhdr *)skb->data)->h_proto; // XXX
672 + if ((dev->flags & IFF_UP) != 0) {
674 + DEV_QUEUE_XMIT(clone, dev, 0);
677 + dev_kfree_skb(clone);
683 + * Send up (imitate Ethernet receive)
685 + * Do this if the packet is addressed to the peer (or is broadcast, etc.).
687 + * This packet will get back to us, via VNetBridgeReceive.
688 + * We save it so we can recognize it (and its clones) again.
691 + if (VNetPacketMatch(dest, dev->dev_addr, (uint8 *)&AllMultiFilter, dev->flags)) {
692 + clone = skb_clone(skb, GFP_ATOMIC);
694 + unsigned long flags;
697 + atomic_inc(&clone->users);
700 + clone->protocol = eth_type_trans(clone, dev);
701 + spin_lock_irqsave(&bridge->historyLock, flags);
702 + for (i = 0; i < VNET_BRIDGE_HISTORY; i++) {
703 + if (bridge->history[i] == NULL) {
704 + bridge->history[i] = clone;
709 + for (j = 0; j < VNET_BRIDGE_HISTORY; j++) {
710 + if (bridge->history[j] != NULL) {
714 + LOG(3, (KERN_DEBUG "bridge-%s: host slot %d history %d\n",
715 + bridge->name, i, count));
721 + if (i >= VNET_BRIDGE_HISTORY) {
722 + LOG(1, (KERN_NOTICE "bridge-%s: history full\n",
725 + for (i = 0; i < VNET_BRIDGE_HISTORY; i++) {
726 + struct sk_buff *s = bridge->history[i];
729 + * We special case 0 to avoid races with another thread on
730 + * another cpu wanting to use the 0 entry. This could happen
731 + * when we release the lock to free the former entry.
732 + * See bug 11231 for details.
735 + bridge->history[0] = clone;
737 + bridge->history[i] = NULL;
740 + spin_unlock_irqrestore(&bridge->historyLock, flags);
742 + spin_lock_irqsave(&bridge->historyLock, flags);
746 + spin_unlock_irqrestore(&bridge->historyLock, flags);
749 + * We used to cli() before calling netif_rx() here. It was probably
750 + * unneeded (as we never did it in netif.c, and the code worked). In
751 + * any case, now that we are using netif_rx_ni(), we should certainly
752 + * not do it, or netif_rx_ni() will deadlock on the cli() lock --hpreg
755 + netif_rx_ni(clone);
757 + do_gettimeofday(&vnetTime);
763 + dev_kfree_skb(skb);
768 + *----------------------------------------------------------------------
770 + * VNetBridgeCycleDetect --
772 + * Cycle detection algorithm.
775 + * TRUE if a cycle was detected, FALSE otherwise.
780 + *----------------------------------------------------------------------
784 +VNetBridgeCycleDetect(VNetJack *this, // IN: jack
785 + int generation) // IN: generation
787 + VNetBridge *bridge = (VNetBridge*)this->private;
788 + return VNetCycleDetectIf(bridge->name, generation);
793 + *----------------------------------------------------------------------
795 + * VNetBridgePortsChanged --
797 + * The number of ports connected to this jack has change, react
798 + * accordingly by starting/stopping promiscuous mode based on
799 + * whether any peers exist.
805 + * Promiscuous mode may be started or stopped.
807 + *----------------------------------------------------------------------
811 +VNetBridgePortsChanged(VNetJack *this) // IN: jack
813 + VNetBridge *bridge = (VNetBridge*)this->private;
815 + if (VNetGetAttachedPorts(this)) {
816 + VNetBridgeStartPromisc(bridge, TRUE);
818 + VNetBridgeStopPromisc(bridge, TRUE);
825 + *----------------------------------------------------------------------
827 + * VNetBridgeIsBridged --
829 + * Reports if the bridged interface is up or down.
832 + * 1 - we are bridged but the interface is not up
833 + * 2 - we are bridged and the interface is up
838 + *----------------------------------------------------------------------
842 +VNetBridgeIsBridged(VNetJack *this) // IN: jack
844 + VNetBridge *bridge = (VNetBridge*)this->private;
853 + *----------------------------------------------------------------------
855 + * VNetBridgeIsDeviceWireless --
857 + * Check if the device is a wireless adapter, depending on the version
858 + * of the wireless extension present in the kernel.
861 + * TRUE if the device is wireless, FALSE otherwise.
866 + *----------------------------------------------------------------------
870 +VNetBridgeIsDeviceWireless(struct net_device *dev) //IN: sock
872 +#if !defined(CONFIG_NET_RADIO)
874 +#elif WIRELESS_EXT > 19
875 + return dev->wireless_handlers != NULL;
876 +#elif WIRELESS_EXT > 12
877 + return dev->wireless_handlers != NULL || dev->get_wireless_stats != NULL;
879 + return dev->get_wireless_stats != NULL;
884 + *----------------------------------------------------------------------
888 + * Bring a bridge up. Gets peer's device structure, verifies
889 + * that interface is up, checks the header length,
890 + * allocates a socket, adds a packet handler to the network
891 + * stack, and then places the peer's device in promiscuous
898 + * Bridging may be brought up with a peer interface.
900 + *----------------------------------------------------------------------
904 +VNetBridgeUp(VNetBridge *bridge, // IN: bridge struct
905 + Bool rtnlLock) // IN: acquire RTNL lock
909 + if (bridge->dev != NULL) {
910 + LOG(0, (KERN_NOTICE "bridge-%s: already up\n", bridge->name));
915 + * Get peer device structure
919 + bridge->dev = DEV_GET(bridge);
920 + LOG(2, (KERN_DEBUG "bridge-%s: got dev %p\n",
921 + bridge->name, bridge->dev));
922 + if (bridge->dev == NULL) {
927 + if (!(bridge->dev->flags & IFF_UP)) {
928 + LOG(2, (KERN_DEBUG "bridge-%s: interface %s is not up\n",
929 + bridge->name, bridge->dev->name));
936 + * At a minimum, the header size should be the same as ours.
938 + * XXX we should either do header translation or ensure this
942 + if (bridge->dev->hard_header_len != ETH_HLEN) {
943 + LOG(1, (KERN_DEBUG "bridge-%s: can't bridge with %s, bad header length %d\n",
944 + bridge->name, bridge->dev->name, bridge->dev->hard_header_len));
951 + * Get a socket to play with
953 + * We set the dead field so we don't get a call back from dev_kfree_skb().
954 + * (The alternative is to support the callback.)
957 + bridge->sk = compat_sk_alloc(bridge, GFP_ATOMIC);
958 + if (bridge->sk == NULL) {
963 + SET_SK_DEAD(bridge->sk);
965 + bridge->wirelessAdapter = VNetBridgeIsDeviceWireless(bridge->dev);
968 + * If it is a wireless adapter initialize smac struct.
971 + if (bridge->wirelessAdapter) {
973 + LOG(1, (KERN_NOTICE "bridge-%s: is a Wireless Adapter\n", bridge->name));
974 + SMAC_InitState(&(bridge->smac));
975 + if (bridge->smac) {
977 + * Store the MAC address of the adapter
980 + SMAC_SetMac(bridge->smac, bridge->dev->dev_addr);
985 + * Link up with the peer device by adding a
986 + * packet handler to the networking stack.
989 + bridge->pt.func = VNetBridgeReceiveFromDev;
990 + bridge->pt.type = htons(ETH_P_ALL);
991 + bridge->pt.dev = bridge->dev;
994 + * TurboLinux10 uses 2.6.0-test5, which we do not support, so special case it,
995 + * 2.6.0 with tl_kernel_version_h is 2.6.0-pre5...
997 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 0) || \
998 + (LINUX_VERSION_CODE == KERNEL_VERSION(2, 6, 0) && defined(__tl_kernel_version_h__))
999 + bridge->pt.data = bridge->sk;
1001 + bridge->pt.af_packet_priv = bridge->sk;
1003 + bridge->enabledPromisc = FALSE;
1004 + bridge->warnPromisc = FALSE;
1005 + dev_add_pack(&bridge->pt);
1006 + dev_unlock_list();
1009 + * Put in promiscuous mode if need be.
1012 + down(&vnetStructureSemaphore);
1013 + if (VNetGetAttachedPorts(&bridge->port.jack)) {
1014 + VNetBridgeStartPromisc(bridge, rtnlLock);
1016 + up(&vnetStructureSemaphore);
1022 + LOG(1, (KERN_DEBUG "bridge-%s: up\n", bridge->name));
1029 + if (retval != 0) {
1030 + if (bridge->sk != NULL) {
1031 + sk_free(bridge->sk);
1032 + bridge->sk = NULL;
1034 + bridge->dev = NULL;
1041 + *----------------------------------------------------------------------
1043 + * VNetBridgeDown --
1045 + * Bring a bridge down. Stops promiscuous mode, removes the
1046 + * packet handler from the network stack, and frees the
1053 + * Bridging is brought down.
1055 + *----------------------------------------------------------------------
1059 +VNetBridgeDown(VNetBridge *bridge, // IN: bridge
1060 + Bool rtnlLock) // IN: acquire RTNL lock
1062 + if (bridge->dev == NULL) {
1063 + LOG(0, (KERN_NOTICE "bridge-%s: already down\n", bridge->name));
1067 + VNetBridgeStopPromisc(bridge, rtnlLock);
1068 + if (bridge->smac){
1069 + SMAC_SetMac(bridge->smac, NULL);
1071 + bridge->dev = NULL;
1072 + dev_remove_pack(&bridge->pt);
1073 + sk_free(bridge->sk);
1074 + bridge->sk = NULL;
1075 + LOG(1, (KERN_DEBUG "bridge-%s: down\n", bridge->name));
1080 + *-----------------------------------------------------------------------------
1082 + * VNetBridgeNotify --
1084 + * Callback on peer device state change. The function brings
1085 + * the bridge up/down in response to changes in the peer device.
1091 + * Promiscuous mode is changed when bridge brought up/down.
1093 + *-----------------------------------------------------------------------------
1097 +VNetBridgeNotify(struct notifier_block *this, // IN: callback data (bridge)
1098 + u_long msg, // IN: type of event
1099 + void *data) // IN: device pertaining to event
1101 + VNetBridge *bridge = list_entry(this, VNetBridge, notifier);
1102 + struct net_device *dev = (struct net_device *) data;
1105 + case NETDEV_UNREGISTER:
1106 + LOG(2, (KERN_DEBUG "bridge-%s: interface %s is unregistering\n",
1107 + bridge->name, dev->name));
1108 + if (dev == bridge->dev) {
1109 + /* This should never happen --hpreg */
1110 + LOG(0, (KERN_WARNING "bridge-%s: interface %s unregistered without "
1111 + "going down! Disabling the bridge\n", bridge->name,
1113 + VNetBridgeDown(bridge, FALSE);
1118 + LOG(2, (KERN_DEBUG "bridge-%s: interface %s is going down\n",
1119 + bridge->name, dev->name));
1120 + if (dev == bridge->dev) {
1121 + LOG(1, (KERN_DEBUG "bridge-%s: disabling the bridge\n",
1123 + VNetBridgeDown(bridge, FALSE);
1128 + LOG(2, (KERN_DEBUG "bridge-%s: interface %s is going up\n",
1129 + bridge->name, dev->name));
1130 + if (bridge->dev == NULL && VNetBridgeDevCompatible(bridge, dev)) {
1133 + LOG(1, (KERN_DEBUG "bridge-%s: enabling the bridge\n", bridge->name));
1134 + errno = VNetBridgeUp(bridge, FALSE);
1140 + LOG(0, (KERN_WARNING "bridge-%s: interface %s not found or not "
1141 + "up\n", bridge->name, dev->name));
1145 + LOG(0, (KERN_WARNING "bridge-%s: interface %s is not a valid "
1146 + "Ethernet interface\n", bridge->name, dev->name));
1150 + LOG(0, (KERN_WARNING "bridge-%s: failed to allocate memory\n",
1155 + /* This should never happen --hpreg */
1156 + LOG(0, (KERN_WARNING "bridge-%s: failed to enable the bridge to "
1157 + "interface %s (error %d)\n", bridge->name, dev->name,
1165 + LOG(2, (KERN_DEBUG "bridge-%s: interface %s is sending notification "
1166 + "0x%lx\n", bridge->name, dev->name, msg));
1170 + return NOTIFY_DONE;
1175 + *----------------------------------------------------------------------
1177 + * VNetBridgeComputeHeaderPos --
1179 + * Compute correct position for UDP/TCP header.
1185 + * transport header pointer updated to point to the tcp/udp header.
1187 + *----------------------------------------------------------------------
1190 +static INLINE_SINGLE_CALLER void
1191 +VNetBridgeComputeHeaderPos(struct sk_buff *skb) // IN: buffer to examine
1193 + /* Maybe some kernel gets it right... */
1194 + if (compat_skb_network_header_len(skb)) {
1197 + switch (be16_to_cpu(skb->protocol)) {
1199 + struct iphdr *ipHdr = compat_skb_ip_header(skb);
1201 + compat_skb_set_transport_header(skb, compat_skb_network_offset(skb) +
1206 + LOG(3, (KERN_DEBUG "Unknown EII protocol %04X: csum at %d\n",
1207 + be16_to_cpu(skb->protocol), compat_skb_csum_offset(skb)));
1215 + * We deal with three types of kernels:
1216 + * New kernels: skb_shinfo() has gso_size member, and there is
1217 + * skb_gso_segment() helper to split GSO skb into flat ones.
1218 + * Older kernels: skb_shinfo() has tso_size member, and there is
1220 + * Oldest kernels: without any segmentation offload support.
1222 +#if defined(NETIF_F_GSO) || LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 18)
1223 +#define VNetBridgeIsGSO(skb) skb_shinfo(skb)->gso_size
1224 +#define VNetBridgeGSOSegment(skb) skb_gso_segment(skb, 0)
1225 +#elif defined(NETIF_F_TSO)
1226 +#define VNetBridgeIsGSO(skb) skb_shinfo(skb)->tso_size
1230 + *----------------------------------------------------------------------
1232 + * VNetBridgeGSOSegment --
1234 + * Split a large TCP/IPv4 sk_buff into multiple sk_buffs of
1235 + * size skb_shinfo(skb)->tso_size
1236 + * Called from VNetBridgeSendLargePacket().
1239 + * List of skbs created.
1242 + * The incoming packet is split into multiple packets.
1244 + *----------------------------------------------------------------------
1247 +static struct sk_buff *
1248 +VNetBridgeGSOSegment(struct sk_buff *skb) // IN: packet to split
1250 + struct sk_buff *segs = NULL;
1251 + struct sk_buff **next = &segs;
1252 + int bytesPerPacket, bytesLeft;
1253 + int macHdrLen, ipHdrLen, tcpHdrLen, allHdrLen;
1254 + int curByteOffset;
1258 + if (((struct ethhdr *)compat_skb_mac_header(skb))->h_proto != htons(ETH_P_IP)) {
1259 + return ERR_PTR(-EPFNOSUPPORT);
1262 + if (compat_skb_ip_header(skb)->protocol != IPPROTO_TCP) {
1263 + return ERR_PTR(-EPROTONOSUPPORT);
1266 + macHdrLen = compat_skb_network_header(skb) - compat_skb_mac_header(skb);
1267 + ipHdrLen = compat_skb_ip_header(skb)->ihl << 2;
1268 + tcpHdrLen = compat_skb_tcp_header(skb)->doff << 2;
1269 + allHdrLen = macHdrLen + ipHdrLen + tcpHdrLen;
1271 + ipID = ntohs(compat_skb_ip_header(skb)->id);
1272 + seqNo = ntohl(compat_skb_tcp_header(skb)->seq);
1274 + /* Host TCP stack populated this (MSS) for the host NIC driver */
1275 + bytesPerPacket = skb_shinfo(skb)->tso_size;
1277 + bytesLeft = skb->len - allHdrLen;
1278 + curByteOffset = allHdrLen;
1280 + while (bytesLeft) {
1281 + struct sk_buff *newSkb;
1282 + int payloadSize = (bytesLeft < bytesPerPacket) ? bytesLeft : bytesPerPacket;
1284 + newSkb = dev_alloc_skb(payloadSize + allHdrLen + NET_IP_ALIGN);
1288 + segs = segs->next;
1289 + newSkb->next = NULL;
1290 + dev_kfree_skb(newSkb);
1292 + return ERR_PTR(-ENOMEM);
1294 + skb_reserve(newSkb, NET_IP_ALIGN);
1295 + newSkb->dev = skb->dev;
1296 + newSkb->protocol = skb->protocol;
1297 + newSkb->pkt_type = skb->pkt_type;
1298 + newSkb->ip_summed = VM_CHECKSUM_PARTIAL;
1302 + * This implies that ALL fields in the IP and TCP headers are copied from
1303 + * the original skb. This is convenient: we'll only fix up fields that
1304 + * need to be changed below
1306 + memcpy(skb_put(newSkb, allHdrLen), skb->data, allHdrLen);
1308 + /* Fix up pointers to different layers */
1309 + compat_skb_reset_mac_header(newSkb);
1310 + compat_skb_set_network_header(newSkb, macHdrLen);
1311 + compat_skb_set_transport_header(newSkb, macHdrLen + ipHdrLen);
1313 + /* Payload copy */
1314 + skb_copy_bits(skb, curByteOffset, compat_skb_tail_pointer(newSkb), payloadSize);
1315 + skb_put(newSkb, payloadSize);
1317 + curByteOffset+=payloadSize;
1318 + bytesLeft -= payloadSize;
1320 + /* Fix up IP hdr */
1321 + compat_skb_ip_header(newSkb)->tot_len = htons(payloadSize + tcpHdrLen + ipHdrLen);
1322 + compat_skb_ip_header(newSkb)->id = htons(ipID);
1323 + compat_skb_ip_header(newSkb)->check = 0;
1324 + /* Recompute new IP checksum */
1325 + compat_skb_ip_header(newSkb)->check =
1326 + ip_fast_csum(compat_skb_network_header(newSkb),
1327 + compat_skb_ip_header(newSkb)->ihl);
1329 + /* Fix up TCP hdr */
1330 + compat_skb_tcp_header(newSkb)->seq = htonl(seqNo);
1331 + /* Clear FIN/PSH if not last packet */
1332 + if (bytesLeft > 0) {
1333 + compat_skb_tcp_header(newSkb)->fin = 0;
1334 + compat_skb_tcp_header(newSkb)->psh = 0;
1336 + /* Recompute partial TCP checksum */
1337 + compat_skb_tcp_header(newSkb)->check =
1338 + ~csum_tcpudp_magic(compat_skb_ip_header(newSkb)->saddr,
1339 + compat_skb_ip_header(newSkb)->daddr,
1340 + payloadSize+tcpHdrLen, IPPROTO_TCP, 0);
1342 + /* Offset of field */
1343 + newSkb->csum = offsetof(struct tcphdr, check);
1345 + /* Join packet to the list of segments */
1347 + next = &newSkb->next;
1349 + /* Bump up our counters */
1351 + seqNo += payloadSize;
1357 +#define VNetBridgeIsGSO(skb) (0)
1358 +#define VNetBridgeGSOSegment(skb) ERR_PTR(-ENOSYS)
1363 + *----------------------------------------------------------------------
1365 + * VNetBridgeSendLargePacket --
1367 + * Split and send a large TCP/IPv4 sk_buff into multiple sk_buffs which
1368 + * fits on wire. Called from VNetBridgeReceiveFromDev(), which is a
1369 + * protocol handler called from the bottom half, so steady as she
1372 + * skb passed in is deallocated by function.
1378 + * The incoming packet is split into multiple packets and sent to the
1381 + *----------------------------------------------------------------------
1385 +VNetBridgeSendLargePacket(struct sk_buff *skb, // IN: packet to split
1386 + VNetBridge *bridge) // IN: bridge
1388 + struct sk_buff *segs;
1390 + segs = VNetBridgeGSOSegment(skb);
1391 + dev_kfree_skb(skb);
1392 + if (IS_ERR(segs)) {
1393 + LOG(1, (KERN_DEBUG "bridge-%s: cannot segment packet: error %ld\n",
1394 + bridge->name, PTR_ERR(segs)));
1399 + struct sk_buff *newSkb;
1402 + segs = newSkb->next;
1403 + newSkb->next = NULL;
1404 + /* Send it along */
1406 + VNetSend(&bridge->port.jack, newSkb);
1412 + *----------------------------------------------------------------------
1414 + * VNetBridgeReceiveFromDev --
1416 + * Receive a packet from a bridged peer device
1418 + * This is called from the bottom half. Must be careful.
1424 + * A packet may be sent to the vnet.
1426 + *----------------------------------------------------------------------
1429 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 14) && \
1430 + !defined(VMW_TL10S64_WORKAROUND)
1432 +VNetBridgeReceiveFromDev(struct sk_buff *skb, // IN: packet to receive
1433 + struct net_device *dev, // IN: unused
1434 + struct packet_type *pt) // IN: pt (pointer to bridge)
1437 +VNetBridgeReceiveFromDev(struct sk_buff *skb, // IN: packet to receive
1438 + struct net_device *dev, // IN: unused
1439 + struct packet_type *pt, // IN: pt (pointer to bridge)
1440 + struct net_device *real_dev) // IN: real device, unused
1443 + VNetBridge *bridge = list_entry(pt, VNetBridge, pt);
1445 + unsigned long flags;
1447 + if (bridge->dev == NULL) {
1448 + LOG(3, (KERN_DEBUG "bridge-%s: received %d closed\n",
1449 + bridge->name, (int) skb->len));
1450 + dev_kfree_skb(skb);
1451 + return -EIO; // value is ignored anyway
1455 + * Check is this is a packet that we sent up to the host, and if
1456 + * so then don't bother to receive the packet.
1459 + spin_lock_irqsave(&bridge->historyLock, flags);
1460 + for (i = 0; i < VNET_BRIDGE_HISTORY; i++) {
1461 + struct sk_buff *s = bridge->history[i];
1463 + (s == skb || SKB_IS_CLONE_OF(skb, s))) {
1464 + bridge->history[i] = NULL;
1465 + spin_unlock_irqrestore(&bridge->historyLock, flags);
1467 + LOG(3, (KERN_DEBUG "bridge-%s: receive %d self %d\n",
1468 + bridge->name, (int) skb->len, i));
1469 + dev_kfree_skb(skb);
1473 + spin_unlock_irqrestore(&bridge->historyLock, flags);
1477 + struct timeval now;
1478 + do_gettimeofday(&now);
1479 + LOG(3, (KERN_DEBUG "bridge-%s: time %d\n",
1481 + (int)((now.tv_sec * 1000000 + now.tv_usec)
1482 + - (vnetTime.tv_sec * 1000000 + vnetTime.tv_usec))));
1486 + if (bridge->smac) {
1487 + if (VNetCallSMACFunc(bridge->smac, &skb, compat_skb_mac_header(skb),
1488 + SMAC_CheckPacketFromHost) !=
1489 + PacketStatusForwardPacket) {
1490 + LOG(4, (KERN_NOTICE "bridge-%s: packet dropped .\n",
1496 +#ifdef KERNEL_2_3_15
1497 + skb = skb_share_check(skb, GFP_ATOMIC);
1501 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 4, 4)
1503 + * Unbelievable... Caller sets h.raw = nh.raw before invoking us...
1505 + VNetBridgeComputeHeaderPos(skb);
1509 + skb_push(skb, skb->data - compat_skb_mac_header(skb));
1510 + LOG(3, (KERN_DEBUG "bridge-%s: receive %d\n",
1511 + bridge->name, (int) skb->len));
1514 + * If this is a large packet, chop chop chop (if supported)...
1516 + if (VNetBridgeIsGSO(skb)) {
1517 + VNetBridgeSendLargePacket(skb, bridge);
1519 + VNetSend(&bridge->port.jack, skb);
1527 + *----------------------------------------------------------------------
1529 + * VNetBridgeProcRead --
1531 + * Callback for read operation on this bridge entry in vnets proc fs.
1534 + * Length of read operation.
1539 + *----------------------------------------------------------------------
1543 +VNetBridgeProcRead(char *page, // IN/OUT: buffer to write into
1544 + char **start, // OUT: 0 if file < 4k, else offset into page
1545 + off_t off, // IN: (unused) offset of read into the file
1546 + int count, // IN: (unused) maximum number of bytes to read
1547 + int *eof, // OUT: TRUE if there is nothing more to read
1548 + void *data) // IN: client data - pointer to bridge
1550 + VNetBridge *bridge = (VNetBridge*)data;
1557 + len += VNetPrintPort(&bridge->port, page+len);
1559 + len += sprintf(page+len, "dev %s ", bridge->name);
1561 + len += sprintf(page+len, "\n");
1567 diff -Nur old/vmware-any-any-update117d/vmnet-only/vmnetInt.h new/vmware-any-any-update117d/vmnet-only/vmnetInt.h
1568 --- old/vmware-any-any-update117d/vmnet-only/vmnetInt.h 2008-08-30 15:50:06.800648000 +0000
1569 +++ new/vmware-any-any-update117d/vmnet-only/vmnetInt.h 2008-08-30 15:59:47.768956250 +0000
1571 # define dev_lock_list() read_lock(&dev_base_lock)
1572 # define dev_unlock_list() read_unlock(&dev_base_lock)
1573 # ifdef VMW_NETDEV_HAS_NET
1574 -# define DEV_GET(x) __dev_get_by_name(dev_net((x)->internalDev), (x)->name)
1575 +# define DEV_GET(x) __dev_get_by_name((x)->internalDev->nd_net, (x)->name)
1577 # define DEV_GET(x) __dev_get_by_name((x)->name)
1581 #ifdef VMW_NETDEV_HAS_NET
1582 extern struct proto vmnet_proto;
1583 -# define compat_sk_alloc(_bri, _pri) sk_alloc(dev_net((_bri)->internalDev), \
1584 +# define compat_sk_alloc(_bri, _pri) sk_alloc((_bri)->internalDev->nd_net, \
1585 PF_NETLINK, _pri, &vmnet_proto)
1586 #elif defined(VMW_HAVE_SK_ALLOC_WITH_PROTO)
1587 extern struct proto vmnet_proto;
1588 diff -Nur old/vmware-any-any-update117d/vmnet-only/vmnetInt.h~ new/vmware-any-any-update117d/vmnet-only/vmnetInt.h~
1589 --- old/vmware-any-any-update117d/vmnet-only/vmnetInt.h~ 1970-01-01 00:00:00.000000000 +0000
1590 +++ new/vmware-any-any-update117d/vmnet-only/vmnetInt.h~ 2008-08-30 15:49:59.016161500 +0000
1592 +/* **********************************************************
1593 + * Copyright 1998 VMware, Inc. All rights reserved. -- VMware Confidential
1594 + * **********************************************************/
1596 +#ifndef __VMNETINT_H__
1597 +#define __VMNETINT_H__
1600 +#define INCLUDE_ALLOW_MODULE
1601 +#include "includeCheck.h"
1602 +#include "driver-config.h"
1606 + * Hide all kernel compatibility stuff in those macros
1609 +/* All kernels above 2.6.23 have net namespaces. */
1610 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) && !defined(VMW_NETDEV_HAS_NET)
1611 +# define VMW_NETDEV_HAS_NET
1614 +/* All kernels above 2.6.23 have skb argument in nf_hookfn. */
1615 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 24) && !defined(VMW_NFHOOK_USES_SKB)
1616 +# define VMW_NFHOOK_USES_SKB
1620 +#ifdef KERNEL_2_4_0
1621 +# define compat_fop_set_owner(_pFop) do { \
1622 + (_pFop)->owner = THIS_MODULE; \
1624 +# define compat_mod_inc_refcount
1625 +# define compat_mod_dec_refcount
1627 +# define compat_fop_set_owner(_pFop)
1628 +# define compat_mod_inc_refcount do { \
1629 + MOD_INC_USE_COUNT; \
1631 +# define compat_mod_dec_refcount do { \
1632 + MOD_DEC_USE_COUNT; \
1638 +# define SKB_IS_CLONE_OF(clone, skb) ( \
1639 + skb_shinfo(clone) == skb_shinfo(skb) \
1642 +# define SKB_IS_CLONE_OF(clone, skb) ( \
1643 + skb_datarefp(clone) == skb_datarefp(skb) \
1646 +#define DEV_QUEUE_XMIT(skb, dev, pri) ( \
1647 + (skb)->dev = (dev), \
1648 + (skb)->priority = (pri), \
1649 + compat_skb_reset_mac_header(skb), \
1650 + compat_skb_set_network_header(skb, sizeof (struct ethhdr)), \
1651 + dev_queue_xmit(skb) \
1653 +#ifdef KERNEL_2_3_15
1654 +# define dev_lock_list() read_lock(&dev_base_lock)
1655 +# define dev_unlock_list() read_unlock(&dev_base_lock)
1656 +# ifdef VMW_NETDEV_HAS_NET
1657 +# define DEV_GET(x) __dev_get_by_name(dev_net((x)->internalDev), (x)->name)
1659 +# define DEV_GET(x) __dev_get_by_name((x)->name)
1662 +# define DEV_GET(x) dev_get((x)->name)
1667 + * Various fields (including 'dead') of struct sock are replaced with the
1668 + * 'flags' bitfield in 2.5.65, with sock_valbool_flag() to set flag's
1669 + * value. Since 2.5.71 there is sock_set_flag() to set bit to 1, and
1670 + * since 2.6.25-rc1 sock_valbool_flag() is gone.
1672 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 65)
1673 +# define SET_SK_DEAD(_sk) (_sk)->dead = 1
1674 +#elif LINUX_VERSION_CODE < KERNEL_VERSION(2, 5, 71)
1675 +# define SET_SK_DEAD(_sk) sock_valbool_flag(_sk, SOCK_DEAD, 1)
1677 +# define SET_SK_DEAD(_sk) sock_set_flag(_sk, SOCK_DEAD)
1681 +#ifdef VMW_NETDEV_HAS_NET
1682 +extern struct proto vmnet_proto;
1683 +# define compat_sk_alloc(_bri, _pri) sk_alloc(dev_net((_bri)->internalDev), \
1684 + PF_NETLINK, _pri, &vmnet_proto)
1685 +#elif defined(VMW_HAVE_SK_ALLOC_WITH_PROTO)
1686 +extern struct proto vmnet_proto;
1687 +# define compat_sk_alloc(_bri, _pri) sk_alloc(PF_NETLINK, _pri, &vmnet_proto, 1)
1688 +#elif defined(KERNEL_2_5_5)
1689 +# define compat_sk_alloc(_bri, _pri) sk_alloc(PF_NETLINK, _pri, 1, NULL)
1691 +# define compat_sk_alloc(_bri, _pri) sk_alloc(0, _pri, 1)
1695 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,0)
1696 +# define fileTraversalLock(lock) spin_lock(lock)
1697 +# define fileTraversalUnLock(lock) spin_unlock(lock)
1698 +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
1699 +# define fileTraversalLock(lock) read_lock(lock)
1700 +# define fileTraversalUnLock(lock) read_unlock(lock)
1701 +#else //2.2 kernels
1702 +# define fileTraversalLock(lock) lock_kernel()
1703 +# define fileTraversalUnLock(lock) unlock_kernel()
1707 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,4,0)
1708 +# define taskLock(lock) task_lock(lock)
1709 +# define taskUnLock(lock) task_unlock(lock)
1710 +#else //2.2 kernels
1711 +# define taskLock(lock) lock_kernel()
1712 +# define taskUnLock(lock) unlock_kernel()
1717 + * Use CHECKSUM_HW for old kernels, if they have CHECKSUM_HW. Use CHECKSUM_PARTIAL for
1718 + * new ones even if CHECKSUM_HW is defined. We do not do decision based on kernel version
1719 + * only as CHECKSUM_PARTIAL was in mm tree for some time already, and we do not test
1720 + * for CHECKSUM_PARTIAL existence as it may get converted to enum in future.
1722 +#if LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 19) && defined(CHECKSUM_HW)
1723 +# define VM_CHECKSUM_PARTIAL CHECKSUM_HW
1725 +# define VM_CHECKSUM_PARTIAL CHECKSUM_PARTIAL
1730 + * The "owner" field in nf_hook_ops got added in 2.5.69
1732 +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 5, 69)
1733 +# define compat_nf_hook_owner .owner = THIS_MODULE,
1735 +# define compat_nf_hook_owner
1739 +#ifdef NF_IP_LOCAL_IN
1740 +#define VMW_NF_INET_LOCAL_IN NF_IP_LOCAL_IN
1741 +#define VMW_NF_INET_POST_ROUTING NF_IP_POST_ROUTING
1743 +#define VMW_NF_INET_LOCAL_IN NF_INET_LOCAL_IN
1744 +#define VMW_NF_INET_POST_ROUTING NF_INET_POST_ROUTING
1748 +#endif /* __VMNETINT_H__ */