|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH] Move to XENVIF VIF interface version 4
This means we can remove a lot of complexity and crucially we no longer
need to use the XENBUS_CACHE interface, which means we can avoid the race
introduced by commit 026aa32c "Make sure XENBUS interfaces are released
when going into S4".
Signed-off-by: Paul Durrant <paul.durrant@xxxxxxxxxx>
---
include/cache_interface.h | 233 -----------------------
include/vif_interface.h | 300 +++++++++++++-----------------
src/coinst/coinst.c | 1 -
src/xennet.inf | 6 +-
src/xennet/adapter.c | 136 ++++++--------
src/xennet/adapter.h | 6 -
src/xennet/receiver.c | 242 ++++++++++--------------
src/xennet/receiver.h | 23 +--
src/xennet/transmitter.c | 456 +++++-----------------------------------------
src/xennet/transmitter.h | 17 +-
10 files changed, 332 insertions(+), 1088 deletions(-)
delete mode 100644 include/cache_interface.h
diff --git a/include/cache_interface.h b/include/cache_interface.h
deleted file mode 100644
index ac50a82..0000000
--- a/include/cache_interface.h
+++ /dev/null
@@ -1,233 +0,0 @@
-/* Copyright (c) Citrix Systems Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms,
- * with or without modification, are permitted provided
- * that the following conditions are met:
- *
- * * Redistributions of source code must retain the above
- * copyright notice, this list of conditions and the
- * following disclaimer.
- * * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the
- * following disclaimer in the documentation and/or other
- * materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*! \file cache_interface.h
- \brief XENBUS CACHE Interface
-
- This interface provides access to XENBUS's object cache
- implementation.
-*/
-
-#ifndef _XENBUS_CACHE_INTERFACE_H
-#define _XENBUS_CACHE_INTERFACE_H
-
-#ifndef _WINDLL
-
-/*! \typedef XENBUS_CACHE
- \brief Cache handle
-*/
-typedef struct _XENBUS_CACHE XENBUS_CACHE, *PXENBUS_CACHE;
-
-/*! \typedef XENBUS_CACHE_ACQUIRE
- \brief Acquire a reference to the CACHE interface
-
- \param Interface The interface header
-*/
-typedef NTSTATUS
-(*XENBUS_CACHE_ACQUIRE)(
- IN PINTERFACE Interface
- );
-
-/*! \typedef XENBUS_CACHE_RELEASE
- \brief Release a reference to the CACHE interface
-
- \param Interface The interface header
-*/
-typedef VOID
-(*XENBUS_CACHE_RELEASE)(
- IN PINTERFACE Interface
- );
-
-/*! \typedef XENBUS_CACHE_CTOR
- \brief Object creator callback
-
- \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
- \param Object Newly allocated object
-
- This callback is invoked just after a new object is allocated and may
- be used to initialize any object data prior to its insertion into the
- cache.
-*/
-typedef NTSTATUS
-(*XENBUS_CACHE_CTOR)(
- IN PVOID Argument,
- IN PVOID Object
- );
-
-/*! \typedef XENBUS_CACHE_DTOR
- \brief Object destructor callback
-
- \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
- \param Object Object about to be freed
-
- This callback is invoked just after an object is removed from the
- cache and before it is freed and may be used to tear down any object data.
-*/
-typedef VOID
-(*XENBUS_CACHE_DTOR)(
- IN PVOID Argument,
- IN PVOID Object
- );
-
-/*! \typedef XENBUS_CACHE_ACQUIRE_LOCK
- \brief Cache lock callback
-
- \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
-
- This callback is invoked if the cache implementation requires mutual
- exclusion.
-*/
-typedef VOID
-(*XENBUS_CACHE_ACQUIRE_LOCK)(
- IN PVOID Argument
- );
-
-/*! \typedef XENBUS_CACHE_RELEASE_LOCK
- \brief Cache unlock callback
-
- \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
-
- This callback is invoked to release the mutual exclusion lock acquired
- by a previous invocation of \a XENBUS_CACHE_ACQUIRE_LOCK.
-*/
-typedef VOID
-(*XENBUS_CACHE_RELEASE_LOCK)(
- IN PVOID Argument
- );
-
-/*! \typedef XENBUS_CACHE_CREATE
- \brief Create a cache of objects of the given \a Size
-
- \param Interface The interface header
- \param Name A name for the cache which will be used in debug output
- \param Size The size of each object in bytes
- \param Reservation The target minimum population of the cache
- \param Ctor A callback which is invoked when a new object created
- \param Dtor A callback which is invoked when an object is destroyed
- \param AcquireLock A callback invoked to acquire a spinlock
- \param ReleaseLock A callback invoked to release the spinlock
- \param Argument An optional context argument passed to the callbacks
- \param Cache A pointer to a cache handle to be initialized
-
- If a non-zero \a Reservation is specified then this method will fail
- unless that number of objects can be immediately created.
-*/
-typedef NTSTATUS
-(*XENBUS_CACHE_CREATE)(
- IN PINTERFACE Interface,
- IN const CHAR *Name,
- IN ULONG Size,
- IN ULONG Reservation,
- IN XENBUS_CACHE_CTOR Ctor,
- IN XENBUS_CACHE_DTOR Dtor,
- IN XENBUS_CACHE_ACQUIRE_LOCK AcquireLock,
- IN XENBUS_CACHE_RELEASE_LOCK ReleaseLock,
- IN PVOID Argument OPTIONAL,
- OUT PXENBUS_CACHE *Cache
- );
-
-/*! \typedef XENBUS_CACHE_GET
- \brief Get an object from a \a Cache
-
- \param Interface The interface header
- \param Cache The cache handle
- \param Locked If mutually exclusive access to the cache is already
- guaranteed then set this to TRUE
-*/
-typedef PVOID
-(*XENBUS_CACHE_GET)(
- IN PINTERFACE Interface,
- IN PXENBUS_CACHE Cache,
- IN BOOLEAN Locked
- );
-
-/*! \typedef XENBUS_CACHE_PUT
- \brief Return an object to a \a Cache
-
- \param Interface The interface header
- \param Cache The cache handle
- \param Locked If mutually exclusive access to the cache is already
- guaranteed then set this to TRUE
-*/
-typedef VOID
-(*XENBUS_CACHE_PUT)(
- IN PINTERFACE Interface,
- IN PXENBUS_CACHE Cache,
- IN PVOID Object,
- IN BOOLEAN Locked
- );
-
-/*! \typedef XENBUS_CACHE_DESTROY
- \brief Destroy a \a Cache
-
- \param Interface The interface header
- \param Cache The cache handle
-
- All objects must have been returned to the cache prior to destruction
-*/
-typedef VOID
-(*XENBUS_CACHE_DESTROY)(
- IN PINTERFACE Interface,
- IN PXENBUS_CACHE Cache
- );
-
-// {A98DFD78-416A-4949-92A5-E084F2F4B44E}
-DEFINE_GUID(GUID_XENBUS_CACHE_INTERFACE,
-0xa98dfd78, 0x416a, 0x4949, 0x92, 0xa5, 0xe0, 0x84, 0xf2, 0xf4, 0xb4, 0x4e);
-
-/*! \struct _XENBUS_CACHE_INTERFACE_V1
- \brief CACHE interface version 1
- \ingroup interfaces
-*/
-struct _XENBUS_CACHE_INTERFACE_V1 {
- INTERFACE Interface;
- XENBUS_CACHE_ACQUIRE CacheAcquire;
- XENBUS_CACHE_RELEASE CacheRelease;
- XENBUS_CACHE_CREATE CacheCreate;
- XENBUS_CACHE_GET CacheGet;
- XENBUS_CACHE_PUT CachePut;
- XENBUS_CACHE_DESTROY CacheDestroy;
-};
-
-typedef struct _XENBUS_CACHE_INTERFACE_V1 XENBUS_CACHE_INTERFACE,
*PXENBUS_CACHE_INTERFACE;
-
-/*! \def XENBUS_CACHE
- \brief Macro at assist in method invocation
-*/
-#define XENBUS_CACHE(_Method, _Interface, ...) \
- (_Interface)->Cache ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
-
-#endif // _WINDLL
-
-#define XENBUS_CACHE_INTERFACE_VERSION_MIN 1
-#define XENBUS_CACHE_INTERFACE_VERSION_MAX 1
-
-#endif // _XENBUS_CACHE_INTERFACE_H
diff --git a/include/vif_interface.h b/include/vif_interface.h
index e5f8534..27c5d2d 100644
--- a/include/vif_interface.h
+++ b/include/vif_interface.h
@@ -43,6 +43,28 @@
#include <ifdef.h>
#include <ethernet.h>
+/*! \enum _XENVIF_PACKET_HASH_ALGORITHM
+ \brief Hash algorithm
+*/
+typedef enum _XENVIF_PACKET_HASH_ALGORITHM {
+ /*! None (value should be ignored) */
+ XENVIF_PACKET_HASH_ALGORITHM_NONE = 0,
+ /*! Unspecified hash (value can be used) */
+ XENVIF_PACKET_HASH_ALGORITHM_UNSPECIFIED
+} XENVIF_PACKET_HASH_ALGORITHM, *PXENVIF_PACKET_HASH_ALGORITHM;
+
+/*! \struct _XENVIF_PACKET_HASH_V1
+ \brief Hash information
+*/
+struct _XENVIF_PACKET_HASH_V1 {
+ /*! Hash algorithm used to calculate value */
+ XENVIF_PACKET_HASH_ALGORITHM Algorithm;
+ /*! Calculated value */
+ ULONG Value;
+};
+
+typedef struct _XENVIF_PACKET_HASH_V1 XENVIF_PACKET_HASH, *PXENVIF_PACKET_HASH;
+
/*! \struct _XENVIF_PACKET_HEADER_V1
\brief Packet header information
*/
@@ -53,14 +75,25 @@ struct _XENVIF_PACKET_HEADER_V1 {
ULONG Length;
};
-/*! \struct _XENVIF_PACKET_INFO_V1
+struct _XENVIF_PACKET_INFO_V1 {
+ ULONG Length;
+ USHORT TagControlInformation;
+ BOOLEAN IsAFragment;
+ struct _XENVIF_PACKET_HEADER_V1 EthernetHeader;
+ struct _XENVIF_PACKET_HEADER_V1 LLCSnapHeader;
+ struct _XENVIF_PACKET_HEADER_V1 IpHeader;
+ struct _XENVIF_PACKET_HEADER_V1 IpOptions;
+ struct _XENVIF_PACKET_HEADER_V1 TcpHeader;
+ struct _XENVIF_PACKET_HEADER_V1 TcpOptions;
+ struct _XENVIF_PACKET_HEADER_V1 UdpHeader;
+};
+
+/*! \struct _XENVIF_PACKET_INFO_V2
\brief Packet information
*/
-struct _XENVIF_PACKET_INFO_V1 {
+struct _XENVIF_PACKET_INFO_V2 {
/*! Total length of all headers */
ULONG Length;
- /*! VLAN TCI if present (0 indicates not present) */
- USHORT TagControlInformation;
/*! TRUE if the packet is an IP fragment */
BOOLEAN IsAFragment;
/*! Ethernet header (stripped of any VLAN tag) */
@@ -79,7 +112,7 @@ struct _XENVIF_PACKET_INFO_V1 {
struct _XENVIF_PACKET_HEADER_V1 UdpHeader;
};
-typedef struct _XENVIF_PACKET_INFO_V1 XENVIF_PACKET_INFO,
*PXENVIF_PACKET_INFO;
+typedef struct _XENVIF_PACKET_INFO_V2 XENVIF_PACKET_INFO,
*PXENVIF_PACKET_INFO;
#pragma warning(push)
#pragma warning(disable:4214) // nonstandard extension used : bit field
types other than int
@@ -120,32 +153,18 @@ typedef struct _XENVIF_PACKET_CHECKSUM_FLAGS_V1
XENVIF_PACKET_CHECKSUM_FLAGS, *P
#pragma warning(pop)
-/*! \struct _XENVIF_RECEIVER_PACKET_V1
- \brief Receive-side packet structure
-*/
struct _XENVIF_RECEIVER_PACKET_V1 {
- /*! List entry used for chaining packets together */
LIST_ENTRY ListEntry;
- /*! Pointer to packet information */
struct _XENVIF_PACKET_INFO_V1 *Info;
- /*! Offset of start of packet in MDL */
ULONG Offset;
- /*! Total length of packet */
ULONG Length;
- /*! Checksum flags */
struct _XENVIF_PACKET_CHECKSUM_FLAGS_V1 Flags;
- /*! TCP MSS if the packet contains a TCP large segment */
USHORT MaximumSegmentSize;
- /*! Opaque cookie used to store context information for packet return */
PVOID Cookie;
- /*! MDL referencing the initial buffer of the packet */
MDL Mdl;
- /*! PFN information, which must always follow an MDL */
PFN_NUMBER __Pfn;
};
-typedef struct _XENVIF_RECEIVER_PACKET_V1 XENVIF_RECEIVER_PACKET,
*PXENVIF_RECEIVER_PACKET;
-
#pragma warning(push)
#pragma warning(disable:4214) // nonstandard extension used : bit field
types other than int
#pragma warning(disable:4201) // nonstandard extension used : nameless
struct/union
@@ -190,32 +209,18 @@ typedef struct _XENVIF_VIF_OFFLOAD_OPTIONS_V1
XENVIF_VIF_OFFLOAD_OPTIONS, *PXENV
#pragma pack(push, 1)
-/*! \struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1
- \brief Packet information passed from subscriber to provider on
- transmit side packet send
-
- To fit into the reserved space in NDIS_PACKET and NET_BUFFER structures
- this structure must be at most the size of 3 pointer types.
-*/
struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1 {
- /*! Offload options for this packet */
XENVIF_VIF_OFFLOAD_OPTIONS OffloadOptions;
- /*! TCP MSS (used only if OffloadOptions.OffloadIpVersion[4|6]LargePacket
is set) */
USHORT MaximumSegmentSize;
- /*! VLAN TCI (used only if OffloadOptions.OffloadTagManipulation is set) */
USHORT TagControlInformation;
};
-typedef struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1
XENVIF_TRANSMITTER_PACKET_SEND_INFO, *PXENVIF_TRANSMITTER_PACKET_SEND_INFO;
-
/*! \enum _XENVIF_TRANSMITTER_PACKET_STATUS
\brief Transmit-side packet status
*/
typedef enum _XENVIF_TRANSMITTER_PACKET_STATUS {
- /*! Packet was queued for the backend */
- XENVIF_TRANSMITTER_PACKET_PENDING = 1,
/*! Packet has been successfully processed by the backend */
- XENVIF_TRANSMITTER_PACKET_OK,
+ XENVIF_TRANSMITTER_PACKET_OK = 2,
/*! Packet was dropped */
XENVIF_TRANSMITTER_PACKET_DROPPED,
/*! There was a problem handling the packet */
@@ -242,73 +247,19 @@ struct _XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO_V1 {
typedef struct _XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO_V1
XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO,
*PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO;
-#pragma warning(push)
-#pragma warning(disable:4201) // nonstandard extension used : nameless
struct/union
-
-/*! \struct _XENVIF_TRANSMITTER_PACKET_V1
- \brief Transmit-side packet structure
-*/
-struct _XENVIF_TRANSMITTER_PACKET_V1 {
- /*! Pointer used for chaining packets together */
- struct _XENVIF_TRANSMITTER_PACKET_V1 *Next;
- union {
- struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1 Send;
- struct _XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO_V1 Completion;
- };
-};
-
-typedef struct _XENVIF_TRANSMITTER_PACKET_V1 XENVIF_TRANSMITTER_PACKET_V1,
*PXENVIF_TRANSMITTER_PACKET_V1;
-
-#pragma warning(pop)
-
#pragma pack(pop)
-C_ASSERT(sizeof (struct _XENVIF_TRANSMITTER_PACKET_V1) <= (3 * sizeof
(PVOID)));
-
-/*! \struct _XENVIF_TRANSMITTER_PACKET_V2
- \brief Transmit-side packet structure (v2)
-*/
struct _XENVIF_TRANSMITTER_PACKET_V2 {
- /*! List entry used for chaining packets together */
- LIST_ENTRY ListEntry;
- /*! Opaque cookie used to store context information for packet return */
- PVOID Cookie;
- /*! Hash value set by subscriber */
- ULONG Value;
- /*! Packet information passed from subscriber to provider */
- XENVIF_TRANSMITTER_PACKET_SEND_INFO Send;
- /*! Packet information passed from provider to subscriber on packet return
*/
- XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO Completion;
- /*! Packet data MDL */
- PMDL Mdl;
- /*! Offset into MDL to start of packet */
- ULONG Offset;
- /*! Packet length */
- ULONG Length;
+ LIST_ENTRY ListEntry;
+ PVOID Cookie;
+ ULONG Value;
+ struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1 Send;
+ struct _XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO_V1 Completion;
+ PMDL Mdl;
+ ULONG Offset;
+ ULONG Length;
};
-typedef struct _XENVIF_TRANSMITTER_PACKET_V2 XENVIF_TRANSMITTER_PACKET,
*PXENVIF_TRANSMITTER_PACKET;
-
-/*! \enum _XENVIF_TRANSMITTER_PACKET_OFFSET
- \brief Offsets of packet metadata relative to
- XENVIF_TRANSMITTER_PACKET pointer
-
- Because the transmit side packet structure is limited to 3 pointer
- types in size, not all information about the packet can be passed in
- the structure. Other information can, however, be found by applying
- these byte offsets to the structure pointer and then dereferencing the
- specified type.
-*/
-typedef enum _XENVIF_TRANSMITTER_PACKET_OFFSET {
- /*! The offset of the start of the packet within the MDL (type ULONG) */
- XENVIF_TRANSMITTER_PACKET_OFFSET_OFFSET = 0,
- /*! The total length of the packet (type ULONG) */
- XENVIF_TRANSMITTER_PACKET_LENGTH_OFFSET,
- /*! MDL referencing the initial buffer of the packet (type PMDL) */
- XENVIF_TRANSMITTER_PACKET_MDL_OFFSET,
- XENVIF_TRANSMITTER_PACKET_OFFSET_COUNT
-} XENVIF_TRANSMITTER_PACKET_OFFSET, *PXENVIF_TRANSMITTER_PACKET_OFFSET;
-
/*! \enum _XENVIF_VIF_STATISTIC
\brief Interface statistics
*/
@@ -368,10 +319,10 @@ typedef enum _XENVIF_MAC_FILTER_LEVEL {
\brief Type of callback (see \ref XENVIF_VIF_CALLBACK)
*/
typedef enum _XENVIF_VIF_CALLBACK_TYPE {
- /*! Return transmit side packets to the subscriber */
- XENVIF_TRANSMITTER_RETURN_PACKETS = 0,
- /*! Queue receive side packets at the subscriber */
- XENVIF_RECEIVER_QUEUE_PACKETS,
+ /*! Return a transmit side packet to the subscriber */
+ XENVIF_TRANSMITTER_RETURN_PACKET = 0,
+ /*! Queue a receive side packet at the subscriber */
+ XENVIF_RECEIVER_QUEUE_PACKET,
/*! Notify the subscriber of a MAC (link) state has change */
XENVIF_MAC_STATE_CHANGE
} XENVIF_VIF_CALLBACK_TYPE, *PXENVIF_VIF_CALLBACK_TYPE;
@@ -403,11 +354,19 @@ typedef VOID
\param Type The callback type
\param ... Additional paramaters required by \a Type
- \b XENVIF_TRANSMITTER_RETURN_PACKETS:
- \param Head The head of a chain of XENVIF_TRANSMITTER_PACKET
+ \b XENVIF_TRANSMITTER_RETURN_PACKET:
+ \param Cookie Cookie supplied to XENVIF_TRANSMITTER_QUEUE_PACKET
+ \param Completion Packet completion information
- \b XENVIF_RECEIVER_QUEUE_PACKETS:
- \param List List of XENVIF_TRANSMITTER_PACKET
+ \b XENVIF_RECEIVER_QUEUE_PACKET:
+ \param Mdl The initial MDL of the packet
+ \param Offset The offset of the packet data in the initial MDL
+ \param Length The total length of the packet
+ \param Flags Packet checksum flags
+ \param MaximumSegmentSize The TCP MSS (used only if
OffloadOptions.OffloadIpVersion[4|6]LargePacket is set)
+ \param TagControlInformation The VLAN TCI (used only if
OffloadOptions.OffloadTagManipulation is set)
+ \param Info Header information for the packet
+ \param Cookie Cookie that should be passed to
XENVIF_RECEIVER_RETURN_PACKET method
\b XENVIF_MAC_STATE_CHANGE:
No additional arguments
@@ -468,74 +427,63 @@ typedef NTSTATUS
OUT PULONGLONG Value
);
-/*! \typedef XENVIF_VIF_RECEIVER_RETURN_PACKETS
- \brief Return packets queues for receive by \ref XENVIF_VIF_CALLBACK
- (Type = \ref XENVIF_RECEIVER_QUEUE_PACKETS)
-
- \param Interface The interface header
- \param List List of \ref _XENVIF_RECEIVER_PACKET_V1
-*/
typedef VOID
-(*XENVIF_VIF_RECEIVER_RETURN_PACKETS)(
+(*XENVIF_VIF_RECEIVER_RETURN_PACKETS_V1)(
IN PINTERFACE Interface,
IN PLIST_ENTRY List
);
-/*! \typedef XENVIF_VIF_TRANSMITTER_SET_PACKET_OFFSET
- \brief Set byte offset of packet information relative to
- XENVIF_TRANSMITTER_PACKET pointer.
-
- See \ref _XENVIF_TRANSMITTER_PACKET_OFFSET.
+/*! \typedef XENVIF_VIF_RECEIVER_RETURN_PACKET
+ \brief Return packets queued for receive by \ref XENVIF_VIF_CALLBACK
+ (Type = \ref XENVIF_RECEIVER_QUEUE_PACKET)
\param Interface The interface header
- \param Type The offset type
- \param Value The offset value
+ \param Cookie Cookie passed to XENVIF_RECEIVER_QUEUE_PACKET callback
*/
-typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_SET_PACKET_OFFSET)(
- IN PINTERFACE Interface,
- IN XENVIF_TRANSMITTER_PACKET_OFFSET Type,
- IN LONG_PTR Value
+typedef VOID
+(*XENVIF_VIF_RECEIVER_RETURN_PACKET)(
+ IN PINTERFACE Interface,
+ IN PVOID Cookie
);
-/*! \typedef XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS
- \brief Get the packet headers into supplied buffer
-
- \param Interface The interface header
- \param Packet The packet to acquire headers for.
- \param Headers The buffer to receive headers.
- \param Info The offsets into Headers for relevant headers
-*/
typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS)(
- IN PINTERFACE Interface,
- IN PXENVIF_TRANSMITTER_PACKET Packet,
- OUT PVOID Headers,
- OUT PXENVIF_PACKET_INFO Info
+(*XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS_V2)(
+ IN PINTERFACE Interface,
+ IN struct _XENVIF_TRANSMITTER_PACKET_V2 *Packet,
+ OUT PVOID Headers,
+ OUT PXENVIF_PACKET_INFO Info
);
-/*! \typedef XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS
- \brief Queue transmit side packets at the provider
-
- \param Interface The interface header
- \param Head The head of a chain of _XENVIF_TRANSMITTER_PACKET_V1
-*/
typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS)(
- IN PINTERFACE Interface,
- IN PXENVIF_TRANSMITTER_PACKET_V1 Head
+(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2)(
+ IN PINTERFACE Interface,
+ IN PLIST_ENTRY List
);
-/*! \typedef XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2
- \brief Queue transmit side packets at the provider
+/*! \typedef XENVIF_VIF_TRANSMITTER_QUEUE_PACKET
+ \brief Queue a packet at the provider's transmit side
\param Interface The interface header
- \param List List of _XENVIF_TRANSMITTER_PACKET_V2
+ \param Mdl The initial MDL of the packet
+ \param Offset The offset of the packet data in the initial MDL
+ \param Length The total length of the packet
+ \param OffloadOptions The requested offload options for this packet
+ \param MaximumSegmentSize The TCP MSS (used only if
OffloadOptions.OffloadIpVersion[4|6]LargePacket is set)
+ \param TagControlInformation The VLAN TCI (used only if
OffloadOptions.OffloadTagManipulation is set)
+ \param Hash Hash information for the packet
+ \param Cookie A cookie specified by the caller that will be passed to the
XENVIF_TRANSMITTER_RETURN_PACKET callback
*/
-typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2)(
- IN PINTERFACE Interface,
- IN PLIST_ENTRY List
+typedef VOID
+(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKET)(
+ IN PINTERFACE Interface,
+ IN PMDL Mdl,
+ IN ULONG Offset,
+ IN ULONG Length,
+ IN XENVIF_VIF_OFFLOAD_OPTIONS OffloadOptions,
+ IN USHORT MaximumSegmentSize,
+ IN USHORT TagControlInformation,
+ IN PXENVIF_PACKET_HASH Hash,
+ IN PVOID Cookie
);
/*! \typedef XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS
@@ -594,7 +542,7 @@ typedef VOID
/*! \typedef XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE
\brief Query the maximum number of transmit side packets that can
- be queued in the shared ring between frontend and backend
+ be queued in each shared ring between frontend and backend
\param Interface The interface header
\param Size Buffer to receive the maximum number of packets
@@ -607,7 +555,7 @@ typedef VOID
/*! \typedef XENVIF_VIF_RECEIVER_QUERY_RING_SIZE
\brief Query the maximum number of receive side packets that can
- be queued in the shared ring between backend and frontend
+ be queued in each shared ring between backend and frontend
\param Interface The interface header
\param Size Buffer to receive the maximum number of packets
@@ -744,22 +692,22 @@ typedef NTSTATUS
DEFINE_GUID(GUID_XENVIF_VIF_INTERFACE,
0x76f279cd, 0xca11, 0x418b, 0x92, 0xe8, 0xc5, 0x7f, 0x77, 0xde, 0xe, 0x2e);
-/*! \struct _XENVIF_VIF_INTERFACE_V1
- \brief VIF interface version 1
+/*! \struct _XENVIF_VIF_INTERFACE_V2
+ \brief VIF interface version 2
\ingroup interfaces
*/
-struct _XENVIF_VIF_INTERFACE_V1 {
+struct _XENVIF_VIF_INTERFACE_V2 {
INTERFACE Interface;
XENVIF_VIF_ACQUIRE Acquire;
XENVIF_VIF_RELEASE Release;
XENVIF_VIF_ENABLE Enable;
XENVIF_VIF_DISABLE Disable;
XENVIF_VIF_QUERY_STATISTIC QueryStatistic;
- XENVIF_VIF_RECEIVER_RETURN_PACKETS ReceiverReturnPackets;
+ XENVIF_VIF_RECEIVER_RETURN_PACKETS_V1
ReceiverReturnPacketsVersion1;
XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS ReceiverSetOffloadOptions;
XENVIF_VIF_RECEIVER_QUERY_RING_SIZE ReceiverQueryRingSize;
- XENVIF_VIF_TRANSMITTER_SET_PACKET_OFFSET TransmitterSetPacketOffset;
- XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS TransmitterQueuePackets;
+ XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS_V2
TransmitterGetPacketHeadersVersion2;
+ XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2
TransmitterQueuePacketsVersion2;
XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS
TransmitterQueryOffloadOptions;
XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE
TransmitterQueryLargePacketSize;
XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE TransmitterQueryRingSize;
@@ -773,22 +721,23 @@ struct _XENVIF_VIF_INTERFACE_V1 {
XENVIF_VIF_MAC_QUERY_FILTER_LEVEL MacQueryFilterLevel;
};
-/*! \struct _XENVIF_VIF_INTERFACE_V2
- \brief VIF interface version 2
+/*! \struct _XENVIF_VIF_INTERFACE_V3
+ \brief VIF interface version 3
\ingroup interfaces
*/
-struct _XENVIF_VIF_INTERFACE_V2 {
+struct _XENVIF_VIF_INTERFACE_V3 {
INTERFACE Interface;
XENVIF_VIF_ACQUIRE Acquire;
XENVIF_VIF_RELEASE Release;
XENVIF_VIF_ENABLE Enable;
XENVIF_VIF_DISABLE Disable;
XENVIF_VIF_QUERY_STATISTIC QueryStatistic;
- XENVIF_VIF_RECEIVER_RETURN_PACKETS ReceiverReturnPackets;
+ XENVIF_VIF_RECEIVER_RETURN_PACKETS_V1
ReceiverReturnPacketsVersion1;
XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS ReceiverSetOffloadOptions;
+ XENVIF_VIF_RECEIVER_SET_BACKFILL_SIZE ReceiverSetBackfillSize;
XENVIF_VIF_RECEIVER_QUERY_RING_SIZE ReceiverQueryRingSize;
- XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS
TransmitterGetPacketHeaders;
- XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2 TransmitterQueuePackets;
+ XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS_V2
TransmitterGetPacketHeadersVersion2;
+ XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2
TransmitterQueuePacketsVersion2;
XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS
TransmitterQueryOffloadOptions;
XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE
TransmitterQueryLargePacketSize;
XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE TransmitterQueryRingSize;
@@ -802,23 +751,22 @@ struct _XENVIF_VIF_INTERFACE_V2 {
XENVIF_VIF_MAC_QUERY_FILTER_LEVEL MacQueryFilterLevel;
};
-/*! \struct _XENVIF_VIF_INTERFACE_V3
- \brief VIF interface version 3
+/*! \struct _XENVIF_VIF_INTERFACE_V4
+ \brief VIF interface version 4
\ingroup interfaces
*/
-struct _XENVIF_VIF_INTERFACE_V3 {
+struct _XENVIF_VIF_INTERFACE_V4 {
INTERFACE Interface;
XENVIF_VIF_ACQUIRE Acquire;
XENVIF_VIF_RELEASE Release;
XENVIF_VIF_ENABLE Enable;
XENVIF_VIF_DISABLE Disable;
XENVIF_VIF_QUERY_STATISTIC QueryStatistic;
- XENVIF_VIF_RECEIVER_RETURN_PACKETS ReceiverReturnPackets;
+ XENVIF_VIF_RECEIVER_RETURN_PACKET ReceiverReturnPacket;
XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS ReceiverSetOffloadOptions;
XENVIF_VIF_RECEIVER_SET_BACKFILL_SIZE ReceiverSetBackfillSize;
XENVIF_VIF_RECEIVER_QUERY_RING_SIZE ReceiverQueryRingSize;
- XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS
TransmitterGetPacketHeaders;
- XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2 TransmitterQueuePackets;
+ XENVIF_VIF_TRANSMITTER_QUEUE_PACKET TransmitterQueuePacket;
XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS
TransmitterQueryOffloadOptions;
XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE
TransmitterQueryLargePacketSize;
XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE TransmitterQueryRingSize;
@@ -832,7 +780,7 @@ struct _XENVIF_VIF_INTERFACE_V3 {
XENVIF_VIF_MAC_QUERY_FILTER_LEVEL MacQueryFilterLevel;
};
-typedef struct _XENVIF_VIF_INTERFACE_V3 XENVIF_VIF_INTERFACE,
*PXENVIF_VIF_INTERFACE;
+typedef struct _XENVIF_VIF_INTERFACE_V4 XENVIF_VIF_INTERFACE,
*PXENVIF_VIF_INTERFACE;
/*! \def XENVIF_VIF
\brief Macro at assist in method invocation
@@ -842,7 +790,7 @@ typedef struct _XENVIF_VIF_INTERFACE_V3
XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTER
#endif // _WINDLL
-#define XENVIF_VIF_INTERFACE_VERSION_MIN 1
-#define XENVIF_VIF_INTERFACE_VERSION_MAX 3
+#define XENVIF_VIF_INTERFACE_VERSION_MIN 2
+#define XENVIF_VIF_INTERFACE_VERSION_MAX 4
#endif // _XENVIF_INTERFACE_H
diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index f60aa43..345b0c6 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -45,7 +45,6 @@
#include <stdarg.h>
#include <assert.h>
#include <vif_interface.h>
-#include <cache_interface.h>
#include <tcpip.h>
#include <version.h>
diff --git a/src/xennet.inf b/src/xennet.inf
index 6c4c457..88aaac4 100644
--- a/src/xennet.inf
+++ b/src/xennet.inf
@@ -61,9 +61,9 @@
xennet_coinst_@MAJOR_VERSION@_@MINOR_VERSION@_@MICRO_VERSION@_@BUILD_NUMBER@.dll
; DisplayName Section DeviceID
; ----------- ------- --------
-%XenNetDesc% =XenNet_Inst,
XENVIF\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_NET&REV_08000004
-%XenNetDesc% =XenNet_Inst,
XENVIF\VEN_@VENDOR_PREFIX@0001&DEV_NET&REV_08000004
-%XenNetDesc% =XenNet_Inst,
XENVIF\VEN_@VENDOR_PREFIX@0002&DEV_NET&REV_08000004
+%XenNetDesc% =XenNet_Inst,
XENVIF\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_NET&REV_08000006
+%XenNetDesc% =XenNet_Inst,
XENVIF\VEN_@VENDOR_PREFIX@0001&DEV_NET&REV_08000006
+%XenNetDesc% =XenNet_Inst,
XENVIF\VEN_@VENDOR_PREFIX@0002&DEV_NET&REV_08000006
[XenNet_Inst]
Characteristics=0x84
diff --git a/src/xennet/adapter.c b/src/xennet/adapter.c
index 2c35636..52c7b58 100644
--- a/src/xennet/adapter.c
+++ b/src/xennet/adapter.c
@@ -37,7 +37,6 @@
#include <version.h>
#include <vif_interface.h>
-#include <cache_interface.h>
#include <store_interface.h>
#include <suspend_interface.h>
@@ -66,7 +65,6 @@ typedef struct _PROPERTIES {
struct _XENNET_ADAPTER {
XENVIF_VIF_INTERFACE VifInterface;
- XENBUS_CACHE_INTERFACE CacheInterface;
XENBUS_STORE_INTERFACE StoreInterface;
XENBUS_SUSPEND_INTERFACE SuspendInterface;
@@ -195,20 +193,46 @@ AdapterVifCallback(
va_start(Arguments, Type);
switch (Type) {
- case XENVIF_TRANSMITTER_RETURN_PACKETS: {
- PLIST_ENTRY List;
+ case XENVIF_TRANSMITTER_RETURN_PACKET: {
+ PVOID Cookie;
+ PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO Completion;
- List = va_arg(Arguments, PLIST_ENTRY);
+ Cookie = va_arg(Arguments, PVOID);
+ Completion = va_arg(Arguments,
PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO);
- TransmitterCompletePackets(Adapter->Transmitter, List);
+ TransmitterReturnPacket(Adapter->Transmitter,
+ Cookie,
+ Completion);
break;
}
- case XENVIF_RECEIVER_QUEUE_PACKETS: {
- PLIST_ENTRY List;
-
- List = va_arg(Arguments, PLIST_ENTRY);
-
- ReceiverReceivePackets(Adapter->Receiver, List);
+ case XENVIF_RECEIVER_QUEUE_PACKET: {
+ PMDL Mdl;
+ ULONG Offset;
+ ULONG Length;
+ XENVIF_PACKET_CHECKSUM_FLAGS Flags;
+ USHORT MaximumSegmentSize;
+ USHORT TagControlInformation;
+ PXENVIF_PACKET_INFO Info;
+ PVOID Cookie;
+
+ Mdl = va_arg(Arguments, PMDL);
+ Offset = va_arg(Arguments, ULONG);
+ Length = va_arg(Arguments, ULONG);
+ Flags = va_arg(Arguments, XENVIF_PACKET_CHECKSUM_FLAGS);
+ MaximumSegmentSize = va_arg(Arguments, USHORT);
+ TagControlInformation = va_arg(Arguments, USHORT);
+ Info = va_arg(Arguments, PXENVIF_PACKET_INFO);
+ Cookie = va_arg(Arguments, PVOID);
+
+ ReceiverQueuePacket(Adapter->Receiver,
+ Mdl,
+ Offset,
+ Length,
+ Flags,
+ MaximumSegmentSize,
+ TagControlInformation,
+ Info,
+ Cookie);
break;
}
case XENVIF_MAC_STATE_CHANGE: {
@@ -1050,14 +1074,6 @@ AdapterGetVifInterface(
return &Adapter->VifInterface;
}
-PXENBUS_CACHE_INTERFACE
-AdapterGetCacheInterface(
- IN PXENNET_ADAPTER Adapter
- )
-{
- return &Adapter->CacheInterface;
-}
-
PXENNET_TRANSMITTER
AdapterGetTransmitter(
IN PXENNET_ADAPTER Adapter
@@ -1469,41 +1485,27 @@ AdapterEnable(
)
{
NTSTATUS status;
- NDIS_STATUS ndisStatus;
ASSERT(!Adapter->Enabled);
- status = XENBUS_CACHE(Acquire,
- &Adapter->CacheInterface);
- if (!NT_SUCCESS(status))
- goto fail1;
-
status = XENBUS_STORE(Acquire,
&Adapter->StoreInterface);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail1;
status = XENBUS_SUSPEND(Acquire,
&Adapter->SuspendInterface);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail2;
(VOID) AdapterSetDistribution(Adapter);
- ndisStatus = TransmitterEnable(Adapter->Transmitter);
- if (ndisStatus != NDIS_STATUS_SUCCESS)
- goto fail4;
-
- ndisStatus = ReceiverEnable(Adapter->Receiver);
- if (ndisStatus != NDIS_STATUS_SUCCESS)
- goto fail5;
-
status = XENVIF_VIF(Enable,
&Adapter->VifInterface,
AdapterVifCallback,
Adapter);
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail3;
AdapterMediaStateChange(Adapter);
@@ -1511,22 +1513,13 @@ AdapterEnable(
return NDIS_STATUS_SUCCESS;
-fail6:
- ReceiverDisable(Adapter->Receiver);
-
-fail5:
- TransmitterDisable(Adapter->Transmitter);
-
-fail4:
+fail3:
AdapterClearDistribution(Adapter);
XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
-fail3:
- XENBUS_STORE(Release, &Adapter->StoreInterface);
-
fail2:
- XENBUS_CACHE(Release, &Adapter->CacheInterface);
+ XENBUS_STORE(Release, &Adapter->StoreInterface);
fail1:
return NDIS_STATUS_FAILURE;
@@ -1545,14 +1538,10 @@ AdapterDisable(
AdapterMediaStateChange(Adapter);
- ReceiverDisable(Adapter->Receiver);
- TransmitterDisable(Adapter->Transmitter);
-
AdapterClearDistribution(Adapter);
XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
XENBUS_STORE(Release, &Adapter->StoreInterface);
- XENBUS_CACHE(Release, &Adapter->CacheInterface);
}
VOID
@@ -2779,22 +2768,13 @@ AdapterInitialize(
goto fail2;
status = __QueryInterface(DeviceObject,
- &GUID_XENBUS_CACHE_INTERFACE,
- XENBUS_CACHE_INTERFACE_VERSION_MAX,
- (PINTERFACE)&(*Adapter)->CacheInterface,
- sizeof(XENBUS_CACHE_INTERFACE),
- FALSE);
- if (!NT_SUCCESS(status))
- goto fail3;
-
- status = __QueryInterface(DeviceObject,
&GUID_XENBUS_STORE_INTERFACE,
XENBUS_STORE_INTERFACE_VERSION_MAX,
(PINTERFACE)&(*Adapter)->StoreInterface,
sizeof(XENBUS_STORE_INTERFACE),
FALSE);
if (!NT_SUCCESS(status))
- goto fail4;
+ goto fail3;
status = __QueryInterface(DeviceObject,
&GUID_XENBUS_SUSPEND_INTERFACE,
@@ -2803,42 +2783,42 @@ AdapterInitialize(
sizeof(XENBUS_SUSPEND_INTERFACE),
FALSE);
if (!NT_SUCCESS(status))
- goto fail5;
+ goto fail4;
status = XENVIF_VIF(Acquire,
&(*Adapter)->VifInterface);
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail5;
(*Adapter)->NdisAdapterHandle = Handle;
ndisStatus = TransmitterInitialize(*Adapter, &(*Adapter)->Transmitter);
if (ndisStatus != NDIS_STATUS_SUCCESS)
- goto fail7;
+ goto fail6;
ndisStatus = ReceiverInitialize(*Adapter, &(*Adapter)->Receiver);
if (ndisStatus != NDIS_STATUS_SUCCESS)
- goto fail8;
+ goto fail7;
ndisStatus = AdapterGetAdvancedSettings(*Adapter);
if (ndisStatus != NDIS_STATUS_SUCCESS)
- goto fail9;
+ goto fail8;
ndisStatus = AdapterSetRegistrationAttributes(*Adapter);
if (ndisStatus != NDIS_STATUS_SUCCESS)
- goto fail10;
+ goto fail9;
ndisStatus = AdapterSetGeneralAttributes(*Adapter);
if (ndisStatus != NDIS_STATUS_SUCCESS)
- goto fail11;
+ goto fail10;
ndisStatus = AdapterSetOffloadAttributes(*Adapter);
if (ndisStatus != NDIS_STATUS_SUCCESS)
- goto fail12;
+ goto fail11;
ndisStatus = AdapterSetHeaderDataSplitAttributes(*Adapter);
if (ndisStatus != NDIS_STATUS_SUCCESS)
- goto fail13;
+ goto fail12;
RtlZeroMemory(&Dma, sizeof(NDIS_SG_DMA_DESCRIPTION));
Dma.Header.Type = NDIS_OBJECT_TYPE_SG_DMA_DESCRIPTION;
@@ -2857,31 +2837,28 @@ AdapterInitialize(
return NDIS_STATUS_SUCCESS;
-fail13:
fail12:
fail11:
fail10:
fail9:
+fail8:
ReceiverTeardown((*Adapter)->Receiver);
(*Adapter)->Receiver = NULL;
-fail8:
+fail7:
TransmitterTeardown((*Adapter)->Transmitter);
(*Adapter)->Transmitter = NULL;
-fail7:
+fail6:
(*Adapter)->NdisAdapterHandle = NULL;
XENVIF_VIF(Release, &(*Adapter)->VifInterface);
-fail6:
- RtlZeroMemory(&(*Adapter)->SuspendInterface,
sizeof(XENBUS_SUSPEND_INTERFACE));
-
fail5:
- RtlZeroMemory(&(*Adapter)->StoreInterface, sizeof(XENBUS_STORE_INTERFACE));
+ RtlZeroMemory(&(*Adapter)->SuspendInterface,
sizeof(XENBUS_SUSPEND_INTERFACE));
fail4:
- RtlZeroMemory(&(*Adapter)->CacheInterface, sizeof(XENBUS_CACHE_INTERFACE));
+ RtlZeroMemory(&(*Adapter)->StoreInterface, sizeof(XENBUS_STORE_INTERFACE));
fail3:
RtlZeroMemory(&(*Adapter)->VifInterface, sizeof(XENVIF_VIF_INTERFACE));
@@ -2914,7 +2891,6 @@ AdapterTeardown(
RtlZeroMemory(&Adapter->SuspendInterface,
sizeof(XENBUS_SUSPEND_INTERFACE));
RtlZeroMemory(&Adapter->StoreInterface, sizeof(XENBUS_STORE_INTERFACE));
- RtlZeroMemory(&Adapter->CacheInterface, sizeof(XENBUS_CACHE_INTERFACE));
RtlZeroMemory(&Adapter->VifInterface, sizeof(XENVIF_VIF_INTERFACE));
__AdapterFree(Adapter);
diff --git a/src/xennet/adapter.h b/src/xennet/adapter.h
index 5b2495a..5b0b338 100644
--- a/src/xennet/adapter.h
+++ b/src/xennet/adapter.h
@@ -76,12 +76,6 @@ AdapterGetVifInterface(
IN PXENNET_ADAPTER Adapter
);
-#include <cache_interface.h>
-extern PXENBUS_CACHE_INTERFACE
-AdapterGetCacheInterface(
- IN PXENNET_ADAPTER Adapter
- );
-
#include "transmitter.h"
extern PXENNET_TRANSMITTER
AdapterGetTransmitter(
diff --git a/src/xennet/receiver.c b/src/xennet/receiver.c
index 8bfc10b..4a408c4 100644
--- a/src/xennet/receiver.c
+++ b/src/xennet/receiver.c
@@ -53,15 +53,23 @@ struct _XENNET_RECEIVER {
#define RECEIVER_POOL_TAG 'RteN'
#define IN_NDIS_MAX 1024
+typedef struct _NET_BUFFER_LIST_RESERVED {
+ PVOID Cookie;
+} NET_BUFFER_LIST_RESERVED, *PNET_BUFFER_LIST_RESERVED;
+
+C_ASSERT(sizeof (NET_BUFFER_LIST_RESERVED) <= RTL_FIELD_SIZE(NET_BUFFER_LIST,
MiniportReserved));
+
static PNET_BUFFER_LIST
__ReceiverAllocateNetBufferList(
- IN PXENNET_RECEIVER Receiver,
- IN PMDL Mdl,
- IN ULONG Offset,
- IN ULONG Length
+ IN PXENNET_RECEIVER Receiver,
+ IN PMDL Mdl,
+ IN ULONG Offset,
+ IN ULONG Length,
+ IN PVOID Cookie
)
{
- PNET_BUFFER_LIST NetBufferList;
+ PNET_BUFFER_LIST NetBufferList;
+ PNET_BUFFER_LIST_RESERVED ListReserved;
ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
KeAcquireSpinLockAtDpcLevel(&Receiver->Lock);
@@ -94,16 +102,27 @@ __ReceiverAllocateNetBufferList(
KeReleaseSpinLockFromDpcLevel(&Receiver->Lock);
+ ListReserved =
(PNET_BUFFER_LIST_RESERVED)NET_BUFFER_LIST_MINIPORT_RESERVED(NetBufferList);
+ ASSERT3P(ListReserved->Cookie, ==, NULL);
+ ListReserved->Cookie = Cookie;
+
return NetBufferList;
}
-static VOID
+static PVOID
__ReceiverReleaseNetBufferList(
- IN PXENNET_RECEIVER Receiver,
- IN PNET_BUFFER_LIST NetBufferList,
- IN BOOLEAN Cache
+ IN PXENNET_RECEIVER Receiver,
+ IN PNET_BUFFER_LIST NetBufferList,
+ IN BOOLEAN Cache
)
{
+ PNET_BUFFER_LIST_RESERVED ListReserved;
+ PVOID Cookie;
+
+ ListReserved =
(PNET_BUFFER_LIST_RESERVED)NET_BUFFER_LIST_MINIPORT_RESERVED(NetBufferList);
+ Cookie = ListReserved->Cookie;
+ ListReserved->Cookie = NULL;
+
if (Cache) {
PNET_BUFFER_LIST Old;
PNET_BUFFER_LIST New;
@@ -119,53 +138,29 @@ __ReceiverReleaseNetBufferList(
} else {
NdisFreeNetBufferList(NetBufferList);
}
+
+ return Cookie;
}
-static FORCEINLINE ULONG
-__ReceiverReturnNetBufferLists(
+static FORCEINLINE VOID
+__ReceiverReturnNetBufferList(
IN PXENNET_RECEIVER Receiver,
IN PNET_BUFFER_LIST NetBufferList,
IN BOOLEAN Cache
)
{
PXENVIF_VIF_INTERFACE VifInterface;
- LIST_ENTRY List;
- ULONG Count;
+ PVOID Cookie;
VifInterface = AdapterGetVifInterface(Receiver->Adapter);
- InitializeListHead(&List);
-
- Count = 0;
- while (NetBufferList != NULL) {
- PNET_BUFFER_LIST Next;
- PNET_BUFFER NetBuffer;
- PMDL Mdl;
- PXENVIF_RECEIVER_PACKET Packet;
- Next = NET_BUFFER_LIST_NEXT_NBL(NetBufferList);
- NET_BUFFER_LIST_NEXT_NBL(NetBufferList) = NULL;
-
- NetBuffer = NET_BUFFER_LIST_FIRST_NB(NetBufferList);
- ASSERT3P(NET_BUFFER_NEXT_NB(NetBuffer), ==, NULL);
+ Cookie = __ReceiverReleaseNetBufferList(Receiver, NetBufferList, Cache);
- Mdl = NET_BUFFER_FIRST_MDL(NetBuffer);
+ XENVIF_VIF(ReceiverReturnPacket,
+ VifInterface,
+ Cookie);
- __ReceiverReleaseNetBufferList(Receiver, NetBufferList, Cache);
-
- Packet = CONTAINING_RECORD(Mdl, XENVIF_RECEIVER_PACKET, Mdl);
-
- InsertTailList(&List, &Packet->ListEntry);
-
- Count++;
- NetBufferList = Next;
- }
-
- if (Count != 0)
- XENVIF_VIF(ReceiverReturnPackets,
- VifInterface,
- &List);
-
- return Count;
+ (VOID) InterlockedIncrement(&Receiver->InNDIS);
}
static PNET_BUFFER_LIST
@@ -175,17 +170,23 @@ __ReceiverReceivePacket(
IN ULONG Offset,
IN ULONG Length,
IN XENVIF_PACKET_CHECKSUM_FLAGS Flags,
- IN PXENVIF_PACKET_INFO Info
+ IN USHORT MaximumSegmentSize,
+ IN USHORT TagControlInformation,
+ IN PXENVIF_PACKET_INFO Info,
+ IN PVOID Cookie
)
{
PNET_BUFFER_LIST NetBufferList;
PNET_BUFFER NetBuffer;
NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO csumInfo;
+ UNREFERENCED_PARAMETER(MaximumSegmentSize);
+
NetBufferList = __ReceiverAllocateNetBufferList(Receiver,
Mdl,
Offset,
- Length);
+ Length,
+ Cookie);
if (NetBufferList == NULL)
goto fail1;
@@ -206,10 +207,10 @@ __ReceiverReceivePacket(
NET_BUFFER_LIST_INFO(NetBufferList, TcpIpChecksumNetBufferListInfo) =
(PVOID)(ULONG_PTR)csumInfo.Value;
- if (Info->TagControlInformation != 0) {
+ if (TagControlInformation != 0) {
NDIS_NET_BUFFER_LIST_8021Q_INFO Ieee8021QInfo;
- UNPACK_TAG_CONTROL_INFORMATION(Info->TagControlInformation,
+ UNPACK_TAG_CONTROL_INFORMATION(TagControlInformation,
Ieee8021QInfo.TagHeader.UserPriority,
Ieee8021QInfo.TagHeader.CanonicalFormatId,
Ieee8021QInfo.TagHeader.VlanId);
@@ -265,31 +266,26 @@ __ReceiverReceivePacket(
return NetBufferList;
fail2:
- __ReceiverReleaseNetBufferList(Receiver, NetBufferList, TRUE);
+ (VOID) __ReceiverReleaseNetBufferList(Receiver, NetBufferList, TRUE);
fail1:
return NULL;
}
static VOID
-__ReceiverPushPackets(
+__ReceiverPushPacket(
IN PXENNET_RECEIVER Receiver,
- IN PNET_BUFFER_LIST NetBufferList,
- IN ULONG Count,
- IN BOOLEAN LowResources
+ IN PNET_BUFFER_LIST NetBufferList
)
{
ULONG Flags;
LONG InNDIS;
- InNDIS = Receiver->InNDIS;
+ InNDIS = InterlockedIncrement(&Receiver->InNDIS);
Flags = NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL;
- if (LowResources) {
+ if (InNDIS > IN_NDIS_MAX)
Flags |= NDIS_RECEIVE_FLAGS_RESOURCES;
- } else {
- InNDIS = __InterlockedAdd(&Receiver->InNDIS, Count);
- }
for (;;) {
LONG InNDISMax;
@@ -307,11 +303,11 @@ __ReceiverPushPackets(
NdisMIndicateReceiveNetBufferLists(AdapterGetHandle(Receiver->Adapter),
NetBufferList,
NDIS_DEFAULT_PORT_NUMBER,
- Count,
+ 1,
Flags);
- if (LowResources)
- (VOID) __ReceiverReturnNetBufferLists(Receiver, NetBufferList, FALSE);
+ if (Flags & NDIS_RECEIVE_FLAGS_RESOURCES)
+ (VOID) __ReceiverReturnNetBufferList(Receiver, NetBufferList, FALSE);
}
NDIS_STATUS
@@ -359,24 +355,6 @@ fail1:
return status;
}
-NDIS_STATUS
-ReceiverEnable (
- IN PXENNET_RECEIVER Receiver
- )
-{
- UNREFERENCED_PARAMETER(Receiver);
-
- return NDIS_STATUS_SUCCESS;
-}
-
-VOID
-ReceiverDisable (
- IN PXENNET_RECEIVER Receiver
- )
-{
- UNREFERENCED_PARAMETER(Receiver);
-}
-
VOID
ReceiverTeardown(
IN PXENNET_RECEIVER Receiver
@@ -425,88 +403,54 @@ ReceiverReturnNetBufferLists(
IN ULONG ReturnFlags
)
{
- ULONG Count;
-
UNREFERENCED_PARAMETER(ReturnFlags);
- Count = __ReceiverReturnNetBufferLists(Receiver, NetBufferList, TRUE);
- (VOID) __InterlockedSubtract(&Receiver->InNDIS, Count);
+ while (NetBufferList != NULL) {
+ PNET_BUFFER_LIST Next;
+
+ Next = NET_BUFFER_LIST_NEXT_NBL(NetBufferList);
+ NET_BUFFER_LIST_NEXT_NBL(NetBufferList) = NULL;
+
+ __ReceiverReturnNetBufferList(Receiver, NetBufferList, TRUE);
+
+ NetBufferList = Next;
+ }
}
VOID
-ReceiverReceivePackets(
- IN PXENNET_RECEIVER Receiver,
- IN PLIST_ENTRY List
+ReceiverQueuePacket(
+ IN PXENNET_RECEIVER Receiver,
+ IN PMDL Mdl,
+ IN ULONG Offset,
+ IN ULONG Length,
+ IN XENVIF_PACKET_CHECKSUM_FLAGS Flags,
+ IN USHORT MaximumSegmentSize,
+ IN USHORT TagControlInformation,
+ IN PXENVIF_PACKET_INFO Info,
+ IN PVOID Cookie
)
{
- PXENVIF_VIF_INTERFACE VifInterface;
- PNET_BUFFER_LIST HeadNetBufferList;
- PNET_BUFFER_LIST *TailNetBufferList;
- ULONG Count;
- BOOLEAN LowResources;
+ PXENVIF_VIF_INTERFACE VifInterface;
+ PNET_BUFFER_LIST NetBufferList;
VifInterface = AdapterGetVifInterface(Receiver->Adapter);
- LowResources = FALSE;
-
-again:
- HeadNetBufferList = NULL;
- TailNetBufferList = &HeadNetBufferList;
- Count = 0;
-
- while (!IsListEmpty(List)) {
- PLIST_ENTRY ListEntry;
- PXENVIF_RECEIVER_PACKET Packet;
- PXENVIF_PACKET_INFO Info;
- PMDL Mdl;
- ULONG Offset;
- ULONG Length;
- XENVIF_PACKET_CHECKSUM_FLAGS Flags;
- PNET_BUFFER_LIST NetBufferList;
-
- if (!LowResources &&
- Receiver->InNDIS + Count > IN_NDIS_MAX)
- break;
-
- ListEntry = RemoveHeadList(List);
- ASSERT(ListEntry != List);
-
- RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
-
- Packet = CONTAINING_RECORD(ListEntry, XENVIF_RECEIVER_PACKET,
ListEntry);
- Mdl = &Packet->Mdl;
- Offset = Packet->Offset;
- Length = Packet->Length;
- Flags = Packet->Flags;
- Info = Packet->Info;
-
- NetBufferList = __ReceiverReceivePacket(Receiver, Mdl, Offset, Length,
Flags, Info);
-
- if (NetBufferList != NULL) {
- *TailNetBufferList = NetBufferList;
- TailNetBufferList = &NET_BUFFER_LIST_NEXT_NBL(NetBufferList);
- Count++;
- } else {
- LIST_ENTRY PacketList;
- InitializeListHead(&PacketList);
- InsertTailList(&PacketList, &Packet->ListEntry);
+ NetBufferList = __ReceiverReceivePacket(Receiver,
+ Mdl,
+ Offset,
+ Length,
+ Flags,
+ MaximumSegmentSize,
+ TagControlInformation,
+ Info,
+ Cookie);
- XENVIF_VIF(ReceiverReturnPackets,
- VifInterface,
- &PacketList);
- }
- }
-
- if (Count != 0) {
- ASSERT(HeadNetBufferList != NULL);
-
- __ReceiverPushPackets(Receiver, HeadNetBufferList, Count,
LowResources);
- }
-
- if (!IsListEmpty(List)) {
- ASSERT(!LowResources);
- LowResources = TRUE;
- goto again;
+ if (NetBufferList != NULL) {
+ __ReceiverPushPacket(Receiver, NetBufferList);
+ } else {
+ XENVIF_VIF(ReceiverReturnPacket,
+ VifInterface,
+ Cookie);
}
}
diff --git a/src/xennet/receiver.h b/src/xennet/receiver.h
index 33701a9..fbc0151 100644
--- a/src/xennet/receiver.h
+++ b/src/xennet/receiver.h
@@ -43,16 +43,6 @@ ReceiverInitialize(
OUT PXENNET_RECEIVER *Receiver
);
-extern NDIS_STATUS
-ReceiverEnable(
- IN PXENNET_RECEIVER Receiver
- );
-
-extern VOID
-ReceiverDisable(
- IN PXENNET_RECEIVER Receiver
- );
-
extern VOID
ReceiverTeardown(
IN PXENNET_RECEIVER Receiver
@@ -66,9 +56,16 @@ ReceiverReturnNetBufferLists(
);
extern VOID
-ReceiverReceivePackets(
- IN PXENNET_RECEIVER Receiver,
- IN PLIST_ENTRY List
+ReceiverQueuePacket(
+ IN PXENNET_RECEIVER Receiver,
+ IN PMDL Mdl,
+ IN ULONG Offset,
+ IN ULONG Length,
+ IN XENVIF_PACKET_CHECKSUM_FLAGS Flags,
+ IN USHORT MaximumSegmentSize,
+ IN USHORT TagControlInformation,
+ IN PXENVIF_PACKET_INFO Info,
+ IN PVOID Cookie
);
extern PXENVIF_VIF_OFFLOAD_OPTIONS
diff --git a/src/xennet/transmitter.c b/src/xennet/transmitter.c
index 8c80c7e..5574b9c 100644
--- a/src/xennet/transmitter.c
+++ b/src/xennet/transmitter.c
@@ -33,7 +33,6 @@
#include "transmitter.h"
#include "adapter.h"
#include <vif_interface.h>
-#include <cache_interface.h>
#include <tcpip.h>
#include "dbg_print.h"
#include "assert.h"
@@ -42,98 +41,9 @@ struct _XENNET_TRANSMITTER {
PXENNET_ADAPTER Adapter;
XENVIF_VIF_OFFLOAD_OPTIONS OffloadOptions;
KSPIN_LOCK Lock;
- PXENBUS_CACHE PacketCache;
- PXENBUS_CACHE BufferCache;
};
-#define XENNET_PACKET_CACHE_MIN 32
#define TRANSMITTER_POOL_TAG 'TteN'
-#define BUFFER_CACHE_ITEM_SIZE 512
-#define MAX_HEADERS_LENGTH (sizeof(IP_ADDRESS) + sizeof(IP_ADDRESS) +
sizeof(USHORT) + sizeof(USHORT))
-
-static NTSTATUS
-__TransmitterPacketCtor(
- IN PVOID Argument,
- IN PVOID Object
- )
-{
- UNREFERENCED_PARAMETER(Argument);
- UNREFERENCED_PARAMETER(Object);
- return STATUS_SUCCESS;
-}
-
-static VOID
-__TransmitterPacketDtor(
- IN PVOID Argument,
- IN PVOID Object
- )
-{
- UNREFERENCED_PARAMETER(Argument);
- UNREFERENCED_PARAMETER(Object);
-}
-
-static VOID
-__TransmitterPacketAcquireLock(
- IN PVOID Argument
- )
-{
- PXENNET_TRANSMITTER Transmitter = Argument;
-
- KeAcquireSpinLockAtDpcLevel(&Transmitter->Lock);
-}
-
-static VOID
-__TransmitterPacketReleaseLock(
- IN PVOID Argument
- )
-{
- PXENNET_TRANSMITTER Transmitter = Argument;
-
-#pragma prefast(suppress:26110)
- KeReleaseSpinLockFromDpcLevel(&Transmitter->Lock);
-}
-
-static NTSTATUS
-__TransmitterBufferCtor(
- IN PVOID Argument,
- IN PVOID Object
- )
-{
- UNREFERENCED_PARAMETER(Argument);
- UNREFERENCED_PARAMETER(Object);
- return STATUS_SUCCESS;
-}
-
-static VOID
-__TransmitterBufferDtor(
- IN PVOID Argument,
- IN PVOID Object
- )
-{
- UNREFERENCED_PARAMETER(Argument);
- UNREFERENCED_PARAMETER(Object);
-}
-
-static VOID
-__TransmitterBufferAcquireLock(
- IN PVOID Argument
- )
-{
- PXENNET_TRANSMITTER Transmitter = Argument;
-
- KeAcquireSpinLockAtDpcLevel(&Transmitter->Lock);
-}
-
-static VOID
-__TransmitterBufferReleaseLock(
- IN PVOID Argument
- )
-{
- PXENNET_TRANSMITTER Transmitter = Argument;
-
-#pragma prefast(suppress:26110)
- KeReleaseSpinLockFromDpcLevel(&Transmitter->Lock);
-}
NDIS_STATUS
TransmitterInitialize (
@@ -141,10 +51,13 @@ TransmitterInitialize (
OUT PXENNET_TRANSMITTER *Transmitter
)
{
+ NTSTATUS status;
+
*Transmitter = ExAllocatePoolWithTag(NonPagedPool,
sizeof(XENNET_TRANSMITTER),
TRANSMITTER_POOL_TAG);
+ status = STATUS_NO_MEMORY;
if (*Transmitter == NULL)
goto fail1;
@@ -157,84 +70,12 @@ TransmitterInitialize (
return NDIS_STATUS_SUCCESS;
fail1:
- return NDIS_STATUS_FAILURE;
-}
-
-NDIS_STATUS
-TransmitterEnable (
- IN PXENNET_TRANSMITTER Transmitter
- )
-{
- PXENBUS_CACHE_INTERFACE CacheInterface;
- NTSTATUS status;
-
- CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
- status = XENBUS_CACHE(Create,
- CacheInterface,
- "packet_cache",
- sizeof(XENVIF_TRANSMITTER_PACKET),
- XENNET_PACKET_CACHE_MIN,
- __TransmitterPacketCtor,
- __TransmitterPacketDtor,
- __TransmitterPacketAcquireLock,
- __TransmitterPacketReleaseLock,
- Transmitter,
- &Transmitter->PacketCache);
- if (!NT_SUCCESS(status))
- goto fail1;
-
- status = XENBUS_CACHE(Create,
- CacheInterface,
- "buffer_cache",
- BUFFER_CACHE_ITEM_SIZE,
- 0,
- __TransmitterBufferCtor,
- __TransmitterBufferDtor,
- __TransmitterBufferAcquireLock,
- __TransmitterBufferReleaseLock,
- Transmitter,
- &Transmitter->BufferCache);
- if (!NT_SUCCESS(status))
- goto fail2;
-
- return NDIS_STATUS_SUCCESS;
-
-fail2:
- Error("fail2\n");
-
- XENBUS_CACHE(Destroy,
- CacheInterface,
- Transmitter->PacketCache);
- Transmitter->PacketCache = NULL;
-
-fail1:
Error("fail1\n (%08x)", status);
return NDIS_STATUS_FAILURE;
}
VOID
-TransmitterDisable (
- IN PXENNET_TRANSMITTER Transmitter
- )
-{
- PXENBUS_CACHE_INTERFACE CacheInterface;
-
- CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
- XENBUS_CACHE(Destroy,
- CacheInterface,
- Transmitter->BufferCache);
- Transmitter->BufferCache = NULL;
-
- XENBUS_CACHE(Destroy,
- CacheInterface,
- Transmitter->PacketCache);
- Transmitter->PacketCache = NULL;
-}
-
-VOID
TransmitterTeardown(
IN PXENNET_TRANSMITTER Transmitter
)
@@ -247,74 +88,6 @@ TransmitterTeardown(
ExFreePoolWithTag(Transmitter, TRANSMITTER_POOL_TAG);
}
-static FORCEINLINE PXENVIF_TRANSMITTER_PACKET
-__TransmitterGetPacket(
- IN PXENNET_TRANSMITTER Transmitter
- )
-{
- PXENBUS_CACHE_INTERFACE CacheInterface;
-
- CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
- return XENBUS_CACHE(Get,
- CacheInterface,
- Transmitter->PacketCache,
- FALSE);
-}
-
-static FORCEINLINE VOID
-__TransmitterPutPacket(
- IN PXENNET_TRANSMITTER Transmitter,
- IN PXENVIF_TRANSMITTER_PACKET Packet
- )
-{
- PXENBUS_CACHE_INTERFACE CacheInterface;
-
- CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
- RtlZeroMemory(Packet, sizeof(XENVIF_TRANSMITTER_PACKET));
-
- XENBUS_CACHE(Put,
- CacheInterface,
- Transmitter->PacketCache,
- Packet,
- FALSE);
-}
-
-static FORCEINLINE PVOID
-__TransmitterGetBuffer(
- IN PXENNET_TRANSMITTER Transmitter
- )
-{
- PXENBUS_CACHE_INTERFACE CacheInterface;
-
- CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
- return XENBUS_CACHE(Get,
- CacheInterface,
- Transmitter->BufferCache,
- FALSE);
-}
-
-static FORCEINLINE VOID
-__TransmitterPutBuffer(
- IN PXENNET_TRANSMITTER Transmitter,
- IN PVOID Buffer
- )
-{
- PXENBUS_CACHE_INTERFACE CacheInterface;
-
- CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
- RtlZeroMemory(Buffer, BUFFER_CACHE_ITEM_SIZE);
-
- XENBUS_CACHE(Put,
- CacheInterface,
- Transmitter->BufferCache,
- Buffer,
- FALSE);
-}
-
typedef struct _NET_BUFFER_LIST_RESERVED {
LONG Reference;
} NET_BUFFER_LIST_RESERVED, *PNET_BUFFER_LIST_RESERVED;
@@ -348,34 +121,22 @@ __TransmitterCompleteNetBufferList(
}
static VOID
-__TransmitterCompletePackets(
- IN PXENNET_TRANSMITTER Transmitter,
- IN PLIST_ENTRY List,
- IN NDIS_STATUS Status
+__TransmitterReturnPacket(
+ IN PXENNET_TRANSMITTER Transmitter,
+ IN PVOID Cookie,
+ IN NDIS_STATUS Status
)
{
- while (!IsListEmpty(List)) {
- PLIST_ENTRY ListEntry;
- PXENVIF_TRANSMITTER_PACKET Packet;
- PNET_BUFFER_LIST NetBufferList;
- PNET_BUFFER_LIST_RESERVED ListReserved;
+ PNET_BUFFER_LIST NetBufferList = Cookie;
+ PNET_BUFFER_LIST_RESERVED ListReserved;
- ListEntry = RemoveHeadList(List);
- ASSERT3P(ListEntry, !=, List);
+ ASSERT(NetBufferList != NULL);
- Packet = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_PACKET,
ListEntry);
+ ListReserved =
(PNET_BUFFER_LIST_RESERVED)NET_BUFFER_LIST_MINIPORT_RESERVED(NetBufferList);
- NetBufferList = Packet->Cookie;
- ASSERT(NetBufferList != NULL);
-
- ListReserved =
(PNET_BUFFER_LIST_RESERVED)NET_BUFFER_LIST_MINIPORT_RESERVED(NetBufferList);
-
- ASSERT(ListReserved->Reference != 0);
- if (InterlockedDecrement(&ListReserved->Reference) == 0)
- __TransmitterCompleteNetBufferList(Transmitter, NetBufferList,
Status);
-
- __TransmitterPutPacket(Transmitter, Packet);
- }
+ ASSERT(ListReserved->Reference != 0);
+ if (InterlockedDecrement(&ListReserved->Reference) == 0)
+ __TransmitterCompleteNetBufferList(Transmitter, NetBufferList, Status);
}
static VOID
@@ -444,127 +205,6 @@ __TransmitterOffloadOptions(
}
}
-static ULONG
-__Hash(
- IN PVOID Buffer,
- IN ULONG Length
- )
-{
- PUCHAR Array = (PUCHAR)Buffer;
- ULONG Accumulator;
- ULONG Index;
-
- Accumulator = 0;
-
- for (Index = 0; Index < Length; ++Index) {
- ULONG Overflow;
-
- Accumulator = (Accumulator << 4) + Array[Index];
-
- Overflow = Accumulator & 0x00000f00;
- if (Overflow != 0) {
- Accumulator ^= Overflow >> 8;
- Accumulator ^= Overflow;
- }
- }
-
- return Accumulator;
-}
-
-static ULONG
-__TransmitterCalculateHash(
- IN PVOID Buffer,
- IN PXENVIF_PACKET_INFO Info
- )
-{
- UCHAR Headers[MAX_HEADERS_LENGTH];
- PUCHAR Ptr;
-
- Ptr = (PUCHAR)Headers;
-
- if (Info->IpHeader.Length) {
- PIP_HEADER Ip = (PIP_HEADER)((PUCHAR)Buffer + Info->IpHeader.Offset);
-
- switch (Ip->Version) {
- case 4:
- RtlCopyMemory(Ptr, &Ip->Version4.SourceAddress,
sizeof(IPV4_ADDRESS));
- Ptr += sizeof(IPV4_ADDRESS);
- RtlCopyMemory(Ptr, &Ip->Version4.DestinationAddress,
sizeof(IPV4_ADDRESS));
- Ptr += sizeof(IPV4_ADDRESS);
- break;
- case 6:
- RtlCopyMemory(Ptr, &Ip->Version6.SourceAddress,
sizeof(IPV6_ADDRESS));
- Ptr += sizeof(IPV6_ADDRESS);
- RtlCopyMemory(Ptr, &Ip->Version6.DestinationAddress,
sizeof(IPV6_ADDRESS));
- Ptr += sizeof(IPV6_ADDRESS);
- break;
- default:
- break;
- }
- }
-
- if (Info->TcpHeader.Length) {
- PTCP_HEADER Tcp = (PTCP_HEADER)((PUCHAR)Buffer +
Info->TcpHeader.Offset);
-
- RtlCopyMemory(Ptr, &Tcp->SourcePort, sizeof(USHORT));
- Ptr += sizeof(USHORT);
- RtlCopyMemory(Ptr, &Tcp->DestinationPort, sizeof(USHORT));
- Ptr += sizeof(USHORT);
- } else if (Info->UdpHeader.Length) {
- PUDP_HEADER Udp = (PUDP_HEADER)((PUCHAR)Buffer +
Info->UdpHeader.Offset);
-
- RtlCopyMemory(Ptr, &Udp->SourcePort, sizeof(USHORT));
- Ptr += sizeof(USHORT);
- RtlCopyMemory(Ptr, &Udp->DestinationPort, sizeof(USHORT));
- Ptr += sizeof(USHORT);
- }
-
- if (Ptr == (PUCHAR)Headers)
- return 0;
-
- return __Hash(Headers, (ULONG)((ULONG_PTR)Ptr - (ULONG_PTR)Headers));
-}
-
-static ULONG
-__TransmitterGetHash(
- IN PXENNET_TRANSMITTER Transmitter,
- IN PXENVIF_TRANSMITTER_PACKET Packet
- )
-{
- PXENVIF_VIF_INTERFACE VifInterface;
- ULONG Hash;
- XENVIF_PACKET_INFO Info;
- PVOID Buffer;
- NTSTATUS status;
-
- Hash = 0;
- VifInterface = AdapterGetVifInterface(Transmitter->Adapter);
-
- Buffer = __TransmitterGetBuffer(Transmitter);
- if (Buffer == NULL)
- goto fail1;
-
- RtlZeroMemory(&Info, sizeof(XENVIF_PACKET_INFO));
-
- status = XENVIF_VIF(TransmitterGetPacketHeaders,
- VifInterface,
- Packet,
- Buffer,
- &Info);
- if (!NT_SUCCESS(status))
- goto fail2;
-
- Hash = __TransmitterCalculateHash(Buffer, &Info);
-
- __TransmitterPutBuffer(Transmitter, Buffer);
- return Hash;
-
-fail2:
- __TransmitterPutBuffer(Transmitter, Buffer);
-fail1:
- return 0;
-}
-
VOID
TransmitterSendNetBufferLists(
IN PXENNET_TRANSMITTER Transmitter,
@@ -603,41 +243,30 @@ TransmitterSendNetBufferLists(
&TagControlInformation,
&MaximumSegmentSize);
+ OffloadOptions.Value &= Transmitter->OffloadOptions.Value;
+
ListReserved =
(PNET_BUFFER_LIST_RESERVED)NET_BUFFER_LIST_MINIPORT_RESERVED(NetBufferList);
RtlZeroMemory(ListReserved, sizeof (NET_BUFFER_LIST_RESERVED));
NetBuffer = NET_BUFFER_LIST_FIRST_NB(NetBufferList);
while (NetBuffer != NULL) {
- PXENVIF_TRANSMITTER_PACKET Packet;
-
- Packet = __TransmitterGetPacket(Transmitter);
- if (Packet == NULL) {
- while (ListReserved->Reference--) {
- PLIST_ENTRY ListEntry;
-
- ListEntry = RemoveTailList(&List);
- ASSERT3P(ListEntry, !=, &List);
-
- Packet = CONTAINING_RECORD(ListEntry,
XENVIF_TRANSMITTER_PACKET, ListEntry);
-
- __TransmitterPutPacket(Transmitter, Packet);
- }
- __TransmitterCompleteNetBufferList(Transmitter, NetBufferList,
NDIS_STATUS_NOT_ACCEPTED);
- break;
- }
+ PVOID Cookie = NetBufferList;
+ XENVIF_PACKET_HASH Hash;
ListReserved->Reference++;
- Packet->Cookie = NetBufferList;
- Packet->Send.OffloadOptions.Value = OffloadOptions.Value &
Transmitter->OffloadOptions.Value;
- Packet->Send.MaximumSegmentSize = MaximumSegmentSize;
- Packet->Send.TagControlInformation = TagControlInformation;
- Packet->Mdl = NET_BUFFER_CURRENT_MDL(NetBuffer);
- Packet->Length = NET_BUFFER_DATA_LENGTH(NetBuffer);
- Packet->Offset = NET_BUFFER_CURRENT_MDL_OFFSET(NetBuffer);
- Packet->Value = __TransmitterGetHash(Transmitter, Packet);
+ Hash.Algorithm = XENVIF_PACKET_HASH_ALGORITHM_NONE;
- InsertTailList(&List, &Packet->ListEntry);
+ XENVIF_VIF(TransmitterQueuePacket,
+ AdapterGetVifInterface(Transmitter->Adapter),
+ NET_BUFFER_CURRENT_MDL(NetBuffer),
+ NET_BUFFER_CURRENT_MDL_OFFSET(NetBuffer),
+ NET_BUFFER_DATA_LENGTH(NetBuffer),
+ OffloadOptions,
+ MaximumSegmentSize,
+ TagControlInformation,
+ &Hash,
+ Cookie);
NetBuffer = NET_BUFFER_NEXT_NB(NetBuffer);
}
@@ -645,26 +274,25 @@ TransmitterSendNetBufferLists(
NetBufferList = ListNext;
}
- if (!IsListEmpty(&List)) {
- NTSTATUS status;
-
- status = XENVIF_VIF(TransmitterQueuePackets,
- AdapterGetVifInterface(Transmitter->Adapter),
- &List);
- if (!NT_SUCCESS(status))
- __TransmitterCompletePackets(Transmitter, &List,
NDIS_STATUS_NOT_ACCEPTED);
- }
-
NDIS_LOWER_IRQL(Irql, DISPATCH_LEVEL);
}
VOID
-TransmitterCompletePackets(
- IN PXENNET_TRANSMITTER Transmitter,
- IN PLIST_ENTRY List
+TransmitterReturnPacket(
+ IN PXENNET_TRANSMITTER Transmitter,
+ IN PVOID Cookie,
+ IN PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO Completion
)
{
- __TransmitterCompletePackets(Transmitter, List, NDIS_STATUS_SUCCESS);
+ NDIS_STATUS Status;
+
+ UNREFERENCED_PARAMETER(Completion);
+
+ Status = (Completion->Status == XENVIF_TRANSMITTER_PACKET_OK) ?
+ NDIS_STATUS_SUCCESS :
+ NDIS_STATUS_NOT_ACCEPTED;
+
+ __TransmitterReturnPacket(Transmitter, Cookie, Status);
}
PXENVIF_VIF_OFFLOAD_OPTIONS
diff --git a/src/xennet/transmitter.h b/src/xennet/transmitter.h
index 363b91e..585c5ac 100644
--- a/src/xennet/transmitter.h
+++ b/src/xennet/transmitter.h
@@ -43,16 +43,6 @@ TransmitterInitialize(
OUT PXENNET_TRANSMITTER *Transmitter
);
-extern NDIS_STATUS
-TransmitterEnable(
- IN PXENNET_TRANSMITTER Transmitter
- );
-
-extern VOID
-TransmitterDisable(
- IN PXENNET_TRANSMITTER Transmitter
- );
-
extern VOID
TransmitterTeardown(
IN PXENNET_TRANSMITTER Transmitter
@@ -67,9 +57,10 @@ TransmitterSendNetBufferLists (
);
extern VOID
-TransmitterCompletePackets(
- IN PXENNET_TRANSMITTER Transmitter,
- IN PLIST_ENTRY List
+TransmitterReturnPacket(
+ IN PXENNET_TRANSMITTER Transmitter,
+ IN PVOID Cookie,
+ IN PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO Completion
);
extern PXENVIF_VIF_OFFLOAD_OPTIONS
--
2.1.1
_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |