. Fix probable memory leaks in vmxnet2 FreeBSD driver.
. Changes in shared code that don't affect open-vm-tools functionality.
Signed-off-by: Marcelo Vanzin <mvanzin@vmware.com>
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_MODULE
#define INCLUDE_ALLOW_VMMON
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_VMKDRIVERS
#define INCLUDE_ALLOW_VMK_MODULE
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_MODULE
#define INCLUDE_ALLOW_VMMON
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_VMKDRIVERS
#define INCLUDE_ALLOW_VMK_MODULE
#define INCLUDE_ALLOW_USERLEVEL
#define INCLUDE_ALLOW_VMMON
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMCORE
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_VMMEXT
* INCLUDE_ALLOW_VMMEXT
* INCLUDE_ALLOW_VMCORE
* INCLUDE_ALLOW_MODULE
- * INCLUDE_ALLOW_VMNIXMOD
* INCLUDE_ALLOW_VMKERNEL
* INCLUDE_ALLOW_DISTRIBUTE
* INCLUDE_ALLOW_VMK_MODULE
#endif
#undef INCLUDE_ALLOW_VMMEXT
-#if defined MODULE && !defined VMKERNEL_MODULE && !defined VMNIXMOD && \
+#if defined MODULE && !defined VMKERNEL_MODULE && \
!defined VMMON && !defined INCLUDE_ALLOW_MODULE
#error "The surrounding include file is not allowed in driver modules."
#endif
#undef INCLUDE_ALLOW_VMK_MODULE
#undef INCLUDE_ALLOW_VMKDRIVERS
-#if defined VMNIXMOD && !defined INCLUDE_ALLOW_VMNIXMOD
-#ifndef VMNIXMOD_VM
-#error "The surrounding include file is not allowed in vmnixmod."
-#endif
-#endif
-#undef INCLUDE_ALLOW_VMNIXMOD
-
#if defined VMIROM && ! defined INCLUDE_ALLOW_VMIROM
#error "The surrounding include file is not allowed in vmirom."
#endif
unsigned int second; /* [0, 61] (for leap seconds) */
} TimeUtil_Date;
+typedef struct TimeUtil_TimeOfDay {
+ unsigned long seconds;
+ unsigned long useconds;
+} TimeUtil_TimeOfDay;
typedef struct TimeUtil_Expiration {
/*
EXTERN void TimeUtil_PopulateWithCurrent(Bool local, // IN
TimeUtil_Date *d); // OUT
+EXTERN void TimeUtil_GetTimeOfDay(TimeUtil_TimeOfDay *d); // OUT
+
EXTERN unsigned int TimeUtil_DaysLeft(TimeUtil_Date const *d); // IN
EXTERN Bool TimeUtil_ExpirationLowerThan(TimeUtil_Expiration const *left, // IN
#define INCLUDE_ALLOW_USERLEVEL
#define INCLUDE_ALLOW_VMCORE
#define INCLUDE_ALLOW_VMKERNEL
-#define INCLUDE_ALLOW_VMNIXMOD
#include "includeCheck.h"
// Start here: string creation, destruction, and encoding conversion.
#define INCLUDE_ALLOW_USERLEVEL
#define INCLUDE_ALLOW_VMCORE
#define INCLUDE_ALLOW_VMKERNEL
-#define INCLUDE_ALLOW_VMNIXMOD
#include "includeCheck.h"
#ifdef __cplusplus
#define INCLUDE_ALLOW_USERLEVEL
#define INCLUDE_ALLOW_VMCORE
#define INCLUDE_ALLOW_VMKERNEL
-#define INCLUDE_ALLOW_VMNIXMOD
#include "includeCheck.h"
#include <string.h>
#define INCLUDE_ALLOW_USERLEVEL
#define INCLUDE_ALLOW_VMCORE
#define INCLUDE_ALLOW_VMKERNEL
-#define INCLUDE_ALLOW_VMNIXMOD
#include "includeCheck.h"
#include "unicodeTypes.h"
#define INCLUDE_ALLOW_USERLEVEL
#define INCLUDE_ALLOW_VMCORE
#define INCLUDE_ALLOW_VMKERNEL
-#define INCLUDE_ALLOW_VMNIXMOD
#include "includeCheck.h"
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_MODULE
#define INCLUDE_ALLOW_VMMON
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_VMKDRIVERS
#define INCLUDE_ALLOW_VMK_MODULE
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_MODULE
#define INCLUDE_ALLOW_VMMON
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMKDRIVERS
#define INCLUDE_ALLOW_VMK_MODULE
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_MODULE
#define INCLUDE_ALLOW_VMMON
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMK_MODULE
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_DISTRIBUTE
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_MODULE
#define INCLUDE_ALLOW_VMMON
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMK_MODULE
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_DISTRIBUTE
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_DISTRIBUTE
#define INCLUDE_ALLOW_VMCORE
-#define INCLUDE_ALLOW_VMNIXMOD
#include "includeCheck.h"
#ifndef VM_X86_64
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_MODULE
#define INCLUDE_ALLOW_VMMON
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_VMKDRIVERS
#define INCLUDE_ALLOW_VMK_MODULE
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_MODULE
#define INCLUDE_ALLOW_VMMON
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_VMKDRIVERS
#define INCLUDE_ALLOW_VMK_MODULE
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_MODULE
#define INCLUDE_ALLOW_VMMON
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_VMKDRIVERS
#define INCLUDE_ALLOW_VMK_MODULE
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_MODULE
#define INCLUDE_ALLOW_VMMON
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_VMCORE
#include "includeCheck.h"
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_MODULE
#define INCLUDE_ALLOW_VMMON
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_VMKDRIVERS
#define INCLUDE_ALLOW_VMCORE
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_MODULE
#define INCLUDE_ALLOW_VMMON
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_VMKDRIVERS
#define INCLUDE_ALLOW_VMCORE
#define INCLUDE_ALLOW_VMCORE
#define INCLUDE_ALLOW_MODULE
#define INCLUDE_ALLOW_VMMON
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_VMK_MODULE
#define INCLUDE_ALLOW_DISTRIBUTE
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_MODULE
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_DISTRIBUTE
#define INCLUDE_ALLOW_VMK_MODULE
#define INCLUDE_ALLOW_VMCORE
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_MODULE
#define INCLUDE_ALLOW_VMMON
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMK_MODULE
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_DISTRIBUTE
}
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * TimeUtil_GetTimeOfDay --
+ *
+ * Get the current time for local timezone in seconds and micro-seconds.
+ * same as gettimeofday on posix systems. Time is returned in the 'time'
+ * variable.
+ *
+ * Results:
+ * void
+ *
+ * Side effects:
+ * None.
+ *
+ *-----------------------------------------------------------------------------
+ */
+
+void
+TimeUtil_GetTimeOfDay(TimeUtil_TimeOfDay *timeofday)
+{
+
+#ifdef _WIN32
+ FILETIME ft;
+ uint64 tmptime = 0;
+
+ ASSERT(timeofday != NULL);
+
+ /*
+ * May need to use QueryPerformanceCounter API if we need more
+ * refinement/accuracy than what we are doing below.
+ */
+
+ NOT_TESTED();
+
+ // Get the system time in UTC format.
+ GetSystemTimeAsFileTime(&ft);
+
+ // Convert ft structure to a uint64 containing the # of 100 ns from UTC.
+ tmptime |= ft.dwHighDateTime;
+ tmptime <<= 32;
+ tmptime |= ft.dwLowDateTime;
+
+#define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
+ // Convert file time to unix epoch.
+ tmptime -= DELTA_EPOCH_IN_MICROSECS;
+ // convert into microseconds (since the return is in 100 nseconds).
+ tmptime /= 10;
+ // Get the seconds and microseconds in the timeofday
+ timeofday->seconds = (unsigned long)(tmptime / 1000000UL);
+ timeofday->useconds = (unsigned long)(tmptime % 1000000UL);
+
+
+#undef DELTA_EPOCH_IN_MICROSECS
+#else
+ struct timeval curTime;
+
+ ASSERT(timeofday != NULL);
+
+ gettimeofday(&curTime, NULL);
+ timeofday->seconds = (unsigned long) curTime.tv_sec;
+ timeofday->useconds = (unsigned long) curTime.tv_usec;
+#endif // _WIN32
+
+}
+
+
/*
*----------------------------------------------------------------------
*
#define INCLUDE_ALLOW_USERLEVEL
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_VMCORE
-#define INCLUDE_ALLOW_VMNIXMOD
#include "includeCheck.h"
/* for uint32 */
#include <sys/malloc.h>
#include <sys/kernel.h>
#include <sys/socket.h>
+#include <sys/systm.h>
/*
* FreeBSD 5.3 introduced an MP-safe (multiprocessor-safe) network stack.
VXN_IF_FREE(sc);
}
+ pci_disable_io(dev, SYS_RES_IOPORT);
+ pci_disable_busmaster(dev);
+ VXN_MTX_DESTROY(&sc->vxn_mtx);
+
done:
splx(s);
/*
* Cleanup - release resources and memory
*/
+ VXN_IF_FREE(sc);
contigfree(sc->vxn_dd, sc->vxn_dd->length, M_DEVBUF);
bus_teardown_intr(dev, sc->vxn_irq, sc->vxn_intrhand);
bus_release_resource(dev, SYS_RES_IRQ, 0, sc->vxn_irq);
bus_release_resource(dev, SYS_RES_IOPORT, VXN_PCIR_MAPS, sc->vxn_io);
+ pci_disable_io(dev, SYS_RES_IOPORT);
+ pci_disable_busmaster(dev);
VXN_MTX_DESTROY(&sc->vxn_mtx);
- VXN_IF_FREE(sc);
splx(s);
return 0;
m_new = NULL;
}
}
-
+
/*
* replace the current mbuf in the descriptor with the new one
* and pass the packet up to the kernel
*/
for (i = 0; i < sc->vxn_num_rx_bufs; i++) {
struct mbuf *m_new = NULL;
-
+
+ /*
+ * Allocate an mbuf and initialize it to contain a packet header and
+ * internal data.
+ */
MGETHDR(m_new, M_DONTWAIT, MT_DATA);
if (m_new != NULL) {
+ /* Allocate and attach an mbuf cluster to mbuf. */
MCLGET(m_new, M_DONTWAIT);
if (m_new->m_flags & M_EXT) {
m_adj(m_new, ETHER_ALIGN);
sc->vxn_rx_buffptr[i] = m_new;
sc->vxn_rx_ring[i].ownership = VMXNET2_OWNERSHIP_NIC;
} else {
+ /*
+ * Allocation and attachment of mbuf clusters failed.
+ */
m_freem(m_new);
m_new = NULL;
- return ENOMEM;
+ goto err_release_ring;
}
} else {
- return ENOMEM;
+ /* Allocation of mbuf failed. */
+ goto err_release_ring;
}
}
sc->vxn_rings_allocated = 1;
return 0;
+err_release_ring:
+ /*
+ * Clearup already allocated mbufs and attached clusters.
+ */
+ for (--i; i >= 0; i--) {
+ m_freem(sc->vxn_rx_buffptr[i]);
+ sc->vxn_rx_buffptr[i] = NULL;
+ sc->vxn_rx_ring[i].paddr = 0;
+ sc->vxn_rx_ring[i].bufferLength = 0;
+ sc->vxn_rx_ring[i].ownership = 0;
+ }
+ return ENOMEM;
+
}
/*
#define INCLUDE_ALLOW_USERLEVEL
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_MODULE
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMK_MODULE
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_DISTRIBUTE
#define INCLUDE_ALLOW_VMMON
#define INCLUDE_ALLOW_MODULE
#define INCLUDE_ALLOW_VMCORE
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_DISTRIBUTE
#include "includeCheck.h"
#define INCLUDE_ALLOW_VMCORE
#define INCLUDE_ALLOW_VMMON
#define INCLUDE_ALLOW_MODULE
-#define INCLUDE_ALLOW_VMNIXMOD
#include "includeCheck.h"
#include <linux/autoconf.h>
#define INCLUDE_ALLOW_USERLEVEL
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_MODULE
-#define INCLUDE_ALLOW_VMNIXMOD
#define INCLUDE_ALLOW_VMK_MODULE
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_DISTRIBUTE
#define INCLUDE_ALLOW_VMK_MODULE
#define INCLUDE_ALLOW_VMKERNEL
#define INCLUDE_ALLOW_DISTRIBUTE
-#define INCLUDE_ALLOW_VMNIXMOD
#include "includeCheck.h"
/*
#define INCLUDE_ALLOW_USERLEVEL
#define INCLUDE_ALLOW_VMMEXT
#define INCLUDE_ALLOW_VMCORE
-#define INCLUDE_ALLOW_VMNIXMOD
#include "includeCheck.h"
/* for uint32 */