\param TagControlInformation The VLAN TCI (used only if OffloadOptions.OffloadTagManipulation is set)
\param Info Header information for the packet
\param Hash Hash information for the packet
+ \param More A flag to indicate whether more packets will be queued for the same CPU
\param Cookie Cookie that should be passed to XENVIF_RECEIVER_RETURN_PACKET method
\b XENVIF_MAC_STATE_CHANGE:
IN PVOID Cookie
);
+typedef NTSTATUS
+(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKET_V5)(
+ 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
\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 More A flag to indicate whether there will more packets queued with the same value of Hash
\param Cookie A cookie specified by the caller that will be passed to the XENVIF_TRANSMITTER_RETURN_PACKET callback
*/
typedef NTSTATUS
IN USHORT MaximumSegmentSize,
IN USHORT TagControlInformation,
IN PXENVIF_PACKET_HASH Hash,
+ IN BOOLEAN More,
IN PVOID Cookie
);
XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS ReceiverSetOffloadOptions;
XENVIF_VIF_RECEIVER_SET_BACKFILL_SIZE ReceiverSetBackfillSize;
XENVIF_VIF_RECEIVER_QUERY_RING_SIZE ReceiverQueryRingSize;
- XENVIF_VIF_TRANSMITTER_QUEUE_PACKET TransmitterQueuePacket;
+ XENVIF_VIF_TRANSMITTER_QUEUE_PACKET_V5 TransmitterQueuePacket;
XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS TransmitterQueryOffloadOptions;
XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE TransmitterQueryLargePacketSize;
XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE TransmitterQueryRingSize;
\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_V5 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_MAC_QUERY_FILTER_LEVEL MacQueryFilterLevel;
};
-typedef struct _XENVIF_VIF_INTERFACE_V6 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTERFACE;
+typedef struct _XENVIF_VIF_INTERFACE_V7 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTERFACE;
/*! \def XENVIF_VIF
\brief Macro at assist in method invocation
#endif // _WINDLL
#define XENVIF_VIF_INTERFACE_VERSION_MIN 2
-#define XENVIF_VIF_INTERFACE_VERSION_MAX 6
+#define XENVIF_VIF_INTERFACE_VERSION_MAX 7
#endif // _XENVIF_INTERFACE_H
PacketVersion2->Send.MaximumSegmentSize,
PacketVersion2->Send.TagControlInformation,
&Hash,
+ FALSE,
PacketVersion2);
if (!NT_SUCCESS(status))
InsertTailList(&Reject, &PacketVersion2->ListEntry);
MaximumSegmentSize,
TagControlInformation,
Hash,
+ FALSE,
Cookie);
done:
}
}
+static NTSTATUS
+VifTransmitterQueuePacketVersion5(
+ 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 == FALSE)
+ 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,
IN USHORT MaximumSegmentSize,
IN USHORT TagControlInformation,
IN PXENVIF_PACKET_HASH Hash,
+ IN BOOLEAN More,
IN PVOID Cookie
)
{
MaximumSegmentSize,
TagControlInformation,
Hash,
+ More,
Cookie);
done:
VifReceiverSetOffloadOptions,
VifReceiverSetBackfillSize,
VifReceiverQueryRingSize,
- VifTransmitterQueuePacket,
+ VifTransmitterQueuePacketVersion5,
VifTransmitterQueryOffloadOptions,
VifTransmitterQueryLargePacketSize,
VifTransmitterQueryRingSize,
VifReceiverSetHashAlgorithm,
VifReceiverQueryHashCapabilities,
VifReceiverUpdateHashParameters,
+ VifTransmitterQueuePacketVersion5,
+ 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,
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;
+ }
default:
status = STATUS_NOT_SUPPORTED;
break;
IN USHORT TagControlInformation,
IN PXENVIF_PACKET_INFO Info,
IN PXENVIF_PACKET_HASH Hash,
+ IN BOOLEAN More,
IN PVOID Cookie
)
{
NTSTATUS status;
UNREFERENCED_PARAMETER(Hash);
+ UNREFERENCED_PARAMETER(More);
InfoVersion1 = __VifAllocate(sizeof (struct _XENVIF_PACKET_INFO_V1));
IN USHORT TagControlInformation,
IN PXENVIF_PACKET_INFO Info,
IN PXENVIF_PACKET_HASH Hash,
+ IN BOOLEAN More,
IN PVOID Cookie
)
{
UNREFERENCED_PARAMETER(Hash);
+ UNREFERENCED_PARAMETER(More);
+
+ Context->Callback(Context->Argument,
+ XENVIF_RECEIVER_QUEUE_PACKET,
+ Mdl,
+ Offset,
+ Length,
+ Flags,
+ MaximumSegmentSize,
+ TagControlInformation,
+ Info,
+ Cookie);
+}
+
+static FORCEINLINE VOID
+__VifReceiverQueuePacketVersion6(
+ IN PXENVIF_VIF_CONTEXT Context,
+ 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(More);
+
+ Context->Callback(Context->Argument,
+ XENVIF_RECEIVER_QUEUE_PACKET,
+ Mdl,
+ Offset,
+ Length,
+ Flags,
+ MaximumSegmentSize,
+ TagControlInformation,
+ Info,
+ Hash,
+ Cookie);
+}
+static FORCEINLINE VOID
+__VifReceiverQueuePacket(
+ IN PXENVIF_VIF_CONTEXT Context,
+ 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
+ )
+{
Context->Callback(Context->Argument,
XENVIF_RECEIVER_QUEUE_PACKET,
Mdl,
MaximumSegmentSize,
TagControlInformation,
Info,
+ Hash,
+ More,
Cookie);
}
IN USHORT TagControlInformation,
IN PXENVIF_PACKET_INFO Info,
IN PXENVIF_PACKET_HASH Hash,
+ IN BOOLEAN More,
IN PVOID Cookie
)
{
TagControlInformation,
Info,
Hash,
+ More,
Cookie);
break;
TagControlInformation,
Info,
Hash,
+ More,
Cookie);
break;
case 6:
- Context->Callback(Context->Argument,
- XENVIF_RECEIVER_QUEUE_PACKET,
- Mdl,
- Offset,
- Length,
- Flags,
- MaximumSegmentSize,
- TagControlInformation,
- Info,
- Hash,
- Cookie);
+ __VifReceiverQueuePacketVersion6(Context,
+ Mdl,
+ Offset,
+ Length,
+ Flags,
+ MaximumSegmentSize,
+ TagControlInformation,
+ Info,
+ Hash,
+ More,
+ Cookie);
+ break;
+
+ case 7:
+ __VifReceiverQueuePacket(Context,
+ Mdl,
+ Offset,
+ Length,
+ Flags,
+ MaximumSegmentSize,
+ TagControlInformation,
+ Info,
+ Hash,
+ More,
+ Cookie);
break;
default:
case 4:
case 5:
case 6:
+ case 7:
Context->Callback(Context->Argument,
XENVIF_TRANSMITTER_RETURN_PACKET,
Cookie,