IN PVOID Cookie
);
-typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKET_V6)(
- 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_QUEUE_PACKET
\brief Queue a packet at the provider's transmit side
DEFINE_GUID(GUID_XENVIF_VIF_INTERFACE,
0x76f279cd, 0xca11, 0x418b, 0x92, 0xe8, 0xc5, 0x7f, 0x77, 0xde, 0xe, 0x2e);
-/*! \struct _XENVIF_VIF_INTERFACE_V6
- \brief VIF interface version 6
- \ingroup interfaces
-*/
-struct _XENVIF_VIF_INTERFACE_V6 {
- 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_QUERY_RING_COUNT QueryRingCount;
- XENVIF_VIF_UPDATE_HASH_MAPPING UpdateHashMapping;
- 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_RECEIVER_SET_HASH_ALGORITHM ReceiverSetHashAlgorithm;
- XENVIF_VIF_RECEIVER_QUERY_HASH_CAPABILITIES ReceiverQueryHashCapabilities;
- XENVIF_VIF_RECEIVER_UPDATE_HASH_PARAMETERS ReceiverUpdateHashParameters;
- XENVIF_VIF_TRANSMITTER_QUEUE_PACKET_V6 TransmitterQueuePacket;
- XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS TransmitterQueryOffloadOptions;
- XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE TransmitterQueryLargePacketSize;
- XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE TransmitterQueryRingSize;
- XENVIF_VIF_MAC_QUERY_STATE MacQueryState;
- XENVIF_VIF_MAC_QUERY_MAXIMUM_FRAME_SIZE MacQueryMaximumFrameSize;
- XENVIF_VIF_MAC_QUERY_PERMANENT_ADDRESS MacQueryPermanentAddress;
- XENVIF_VIF_MAC_QUERY_CURRENT_ADDRESS MacQueryCurrentAddress;
- XENVIF_VIF_MAC_QUERY_MULTICAST_ADDRESSES MacQueryMulticastAddresses;
- XENVIF_VIF_MAC_SET_MULTICAST_ADDRESSES MacSetMulticastAddresses;
- XENVIF_VIF_MAC_SET_FILTER_LEVEL MacSetFilterLevel;
- XENVIF_VIF_MAC_QUERY_FILTER_LEVEL MacQueryFilterLevel;
-};
-
-/*! \struct _XENVIF_VIF_INTERFACE_V7
- \brief VIF interface version 7
- \ingroup interfaces
-*/
-struct _XENVIF_VIF_INTERFACE_V7 {
- 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_QUERY_RING_COUNT QueryRingCount;
- XENVIF_VIF_UPDATE_HASH_MAPPING UpdateHashMapping;
- 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_RECEIVER_SET_HASH_ALGORITHM ReceiverSetHashAlgorithm;
- XENVIF_VIF_RECEIVER_QUERY_HASH_CAPABILITIES ReceiverQueryHashCapabilities;
- XENVIF_VIF_RECEIVER_UPDATE_HASH_PARAMETERS ReceiverUpdateHashParameters;
- 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;
- XENVIF_VIF_MAC_QUERY_STATE MacQueryState;
- XENVIF_VIF_MAC_QUERY_MAXIMUM_FRAME_SIZE MacQueryMaximumFrameSize;
- XENVIF_VIF_MAC_QUERY_PERMANENT_ADDRESS MacQueryPermanentAddress;
- XENVIF_VIF_MAC_QUERY_CURRENT_ADDRESS MacQueryCurrentAddress;
- XENVIF_VIF_MAC_QUERY_MULTICAST_ADDRESSES MacQueryMulticastAddresses;
- XENVIF_VIF_MAC_SET_MULTICAST_ADDRESSES MacSetMulticastAddresses;
- XENVIF_VIF_MAC_SET_FILTER_LEVEL MacSetFilterLevel;
- XENVIF_VIF_MAC_QUERY_FILTER_LEVEL MacQueryFilterLevel;
-};
-
/*! \struct _XENVIF_VIF_INTERFACE_V8
\brief VIF interface version 8
\ingroup interfaces
#endif // _WINDLL
-#define XENVIF_VIF_INTERFACE_VERSION_MIN 6
+#define XENVIF_VIF_INTERFACE_VERSION_MIN 8
#define XENVIF_VIF_INTERFACE_VERSION_MAX 8
#endif // _XENVIF_INTERFACE_H
ReleaseMrswLockShared(&Context->Lock);
}
-static NTSTATUS
-VifTransmitterQueuePacketVersion6(
- 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
- )
-{
- PXENVIF_VIF_CONTEXT Context = Interface->Context;
- NTSTATUS status;
-
- AcquireMrswLockShared(&Context->Lock);
-
- status = STATUS_UNSUCCESSFUL;
- if (!Context->Enabled)
- goto done;
-
- status = TransmitterQueuePacket(FrontendGetTransmitter(Context->Frontend),
- Mdl,
- Offset,
- Length,
- OffloadOptions,
- MaximumSegmentSize,
- TagControlInformation,
- Hash,
- FALSE,
- Cookie);
-
-done:
- ReleaseMrswLockShared(&Context->Lock);
-
- return status;
-}
-
static NTSTATUS
VifTransmitterQueuePacket(
IN PINTERFACE Interface,
ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
}
-static struct _XENVIF_VIF_INTERFACE_V6 VifInterfaceVersion6 = {
- { sizeof (struct _XENVIF_VIF_INTERFACE_V6), 6, NULL, NULL, NULL },
- VifAcquire,
- VifRelease,
- VifEnable,
- VifDisable,
- VifQueryStatistic,
- VifQueryRingCount,
- VifUpdateHashMapping,
- VifReceiverReturnPacket,
- VifReceiverSetOffloadOptions,
- VifReceiverSetBackfillSize,
- VifReceiverQueryRingSize,
- VifReceiverSetHashAlgorithm,
- VifReceiverQueryHashCapabilities,
- VifReceiverUpdateHashParameters,
- VifTransmitterQueuePacketVersion6,
- VifTransmitterQueryOffloadOptions,
- VifTransmitterQueryLargePacketSize,
- VifTransmitterQueryRingSize,
- VifMacQueryState,
- VifMacQueryMaximumFrameSize,
- VifMacQueryPermanentAddress,
- VifMacQueryCurrentAddress,
- VifMacQueryMulticastAddresses,
- VifMacSetMulticastAddresses,
- VifMacSetFilterLevel,
- VifMacQueryFilterLevel
-};
-
-static struct _XENVIF_VIF_INTERFACE_V7 VifInterfaceVersion7 = {
- { sizeof (struct _XENVIF_VIF_INTERFACE_V7), 7, NULL, NULL, NULL },
- VifAcquire,
- VifRelease,
- VifEnable,
- VifDisable,
- VifQueryStatistic,
- VifQueryRingCount,
- VifUpdateHashMapping,
- VifReceiverReturnPacket,
- VifReceiverSetOffloadOptions,
- VifReceiverSetBackfillSize,
- VifReceiverQueryRingSize,
- VifReceiverSetHashAlgorithm,
- VifReceiverQueryHashCapabilities,
- VifReceiverUpdateHashParameters,
- VifTransmitterQueuePacket,
- VifTransmitterQueryOffloadOptions,
- VifTransmitterQueryLargePacketSize,
- VifTransmitterQueryRingSize,
- VifMacQueryState,
- VifMacQueryMaximumFrameSize,
- VifMacQueryPermanentAddress,
- VifMacQueryCurrentAddress,
- VifMacQueryMulticastAddresses,
- VifMacSetMulticastAddresses,
- VifMacSetFilterLevel,
- VifMacQueryFilterLevel
-};
-
static struct _XENVIF_VIF_INTERFACE_V8 VifInterfaceVersion8 = {
{ sizeof (struct _XENVIF_VIF_INTERFACE_V8), 8, NULL, NULL, NULL },
VifAcquire,
NTSTATUS status;
switch (Version) {
- case 6: {
- struct _XENVIF_VIF_INTERFACE_V6 *VifInterface;
-
- VifInterface = (struct _XENVIF_VIF_INTERFACE_V6 *)Interface;
-
- status = STATUS_BUFFER_OVERFLOW;
- if (Size < sizeof (struct _XENVIF_VIF_INTERFACE_V6))
- break;
-
- *VifInterface = VifInterfaceVersion6;
-
- ASSERT3U(Interface->Version, ==, Version);
- Interface->Context = Context;
-
- status = STATUS_SUCCESS;
- break;
- }
- case 7: {
- struct _XENVIF_VIF_INTERFACE_V7 *VifInterface;
-
- VifInterface = (struct _XENVIF_VIF_INTERFACE_V7 *)Interface;
-
- status = STATUS_BUFFER_OVERFLOW;
- if (Size < sizeof (struct _XENVIF_VIF_INTERFACE_V7))
- break;
-
- *VifInterface = VifInterfaceVersion7;
-
- ASSERT3U(Interface->Version, ==, Version);
- Interface->Context = Context;
-
- status = STATUS_SUCCESS;
- break;
- }
case 8: {
struct _XENVIF_VIF_INTERFACE_V8 *VifInterface;
Trace("<====\n");
}
-static FORCEINLINE VOID
-__VifReceiverQueuePacketVersion6(
- IN PXENVIF_VIF_CONTEXT Context,
- IN ULONG Index,
- 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 PXENVIF_PACKET_HASH Hash,
- IN BOOLEAN More,
- IN PVOID Cookie
- )
-{
- UNREFERENCED_PARAMETER(Index);
- UNREFERENCED_PARAMETER(More);
-
- Context->Callback(Context->Argument,
- XENVIF_RECEIVER_QUEUE_PACKET,
- Mdl,
- Offset,
- Length,
- Flags,
- MaximumSegmentSize,
- TagControlInformation,
- Info,
- Hash,
- Cookie);
-}
-
-static FORCEINLINE VOID
-__VifReceiverQueuePacketVersion7(
- IN PXENVIF_VIF_CONTEXT Context,
- IN ULONG Index,
- 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 PXENVIF_PACKET_HASH Hash,
- IN BOOLEAN More,
- IN PVOID Cookie
- )
-{
- UNREFERENCED_PARAMETER(Index);
-
- Context->Callback(Context->Argument,
- XENVIF_RECEIVER_QUEUE_PACKET,
- Mdl,
- Offset,
- Length,
- Flags,
- MaximumSegmentSize,
- TagControlInformation,
- Info,
- Hash,
- More,
- Cookie);
-}
-
static FORCEINLINE VOID
__VifReceiverQueuePacket(
IN PXENVIF_VIF_CONTEXT Context,
KeRaiseIrql(DISPATCH_LEVEL, &Irql);
switch (Context->Version) {
- case 6:
- __VifReceiverQueuePacketVersion6(Context,
- Index,
- Mdl,
- Offset,
- Length,
- Flags,
- MaximumSegmentSize,
- TagControlInformation,
- Info,
- Hash,
- More,
- Cookie);
- break;
-
- case 7:
- __VifReceiverQueuePacketVersion7(Context,
- Index,
- Mdl,
- Offset,
- Length,
- Flags,
- MaximumSegmentSize,
- TagControlInformation,
- Info,
- Hash,
- More,
- Cookie);
- break;
-
case 8:
__VifReceiverQueuePacket(Context,
Index,
)
{
switch (Context->Version) {
- case 6:
- case 7:
case 8:
Context->Callback(Context->Argument,
XENVIF_TRANSMITTER_RETURN_PACKET,