XENVIF_MAC_STATE_CHANGE
} XENVIF_VIF_CALLBACK_TYPE, *PXENVIF_VIF_CALLBACK_TYPE;
+/*! \typedef XENVIF_VIF_CALLBACK_PARAMETERS_V9
+ \brief VIF interface version 9 parameters for provider to subscriber callback function
+
+ \b XENVIF_TRANSMITTER_RETURN_PACKET:
+ \param Cookie Cookie supplied to XENVIF_TRANSMITTER_QUEUE_PACKET
+ \param Completion Packet completion information
+
+ \b XENVIF_RECEIVER_QUEUE_PACKET:
+ \param Index The index of the queue on which the packet was received
+ \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 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:
+ No additional arguments
+*/
+union _XENVIF_VIF_CALLBACK_PARAMETERS_V9 {
+ struct {
+ PVOID Cookie;
+ PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO Completion;
+ } TransmitterReturnPacket;
+ struct {
+ ULONG Index;
+ PMDL Mdl;
+ ULONG Offset;
+ ULONG Length;
+ XENVIF_PACKET_CHECKSUM_FLAGS Flags;
+ USHORT MaximumSegmentSize;
+ USHORT TagControlInformation;
+ PXENVIF_PACKET_INFO Info;
+ PXENVIF_PACKET_HASH Hash;
+ BOOLEAN More;
+ PVOID Cookie;
+ } ReceiverQueuePacket;
+};
+
/*! \typedef XENVIF_VIF_ACQUIRE
\brief Acquire a reference to the VIF interface
IN PINTERFACE Interface
);
+typedef VOID
+(*XENVIF_VIF_CALLBACK_V8)(
+ IN PVOID Argument OPTIONAL,
+ IN XENVIF_VIF_CALLBACK_TYPE Type,
+ ...
+ );
+
+typedef union _XENVIF_VIF_CALLBACK_PARAMETERS_V9 XENVIF_VIF_CALLBACK_PARAMETERS, *PXENVIF_VIF_CALLBACK_PARAMETERS;
+
/*! \typedef XENVIF_VIF_CALLBACK
\brief Provider to subscriber callback function
\param Argument An optional context argument passed to the callback
\param Type The callback type
- \param ... Additional paramaters required by \a Type
-
- \b XENVIF_TRANSMITTER_RETURN_PACKET:
- \param Cookie Cookie supplied to XENVIF_TRANSMITTER_QUEUE_PACKET
- \param Completion Packet completion information
-
- \b XENVIF_RECEIVER_QUEUE_PACKET:
- \param Index The index of the queue on which the packet was received
- \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 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:
- No additional arguments
+ \param Parameters The callback parameters
*/
typedef VOID
(*XENVIF_VIF_CALLBACK)(
- IN PVOID Argument OPTIONAL,
- IN XENVIF_VIF_CALLBACK_TYPE Type,
- ...
+ IN PVOID Argument OPTIONAL,
+ IN XENVIF_VIF_CALLBACK_TYPE Type,
+ IN PXENVIF_VIF_CALLBACK_PARAMETERS Parameters
+ );
+
+typedef NTSTATUS
+(*XENVIF_VIF_ENABLE_V8)(
+ IN PINTERFACE Interface,
+ IN XENVIF_VIF_CALLBACK_V8 Callback,
+ IN PVOID Argument OPTIONAL
);
/*! \typedef XENVIF_VIF_ENABLE
\ingroup interfaces
*/
struct _XENVIF_VIF_INTERFACE_V8 {
+ INTERFACE Interface;
+ XENVIF_VIF_ACQUIRE Acquire;
+ XENVIF_VIF_RELEASE Release;
+ XENVIF_VIF_ENABLE_V8 EnableVersion8;
+ 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_V9
+ \brief VIF interface version 9
+ \ingroup interfaces
+*/
+struct _XENVIF_VIF_INTERFACE_V9 {
INTERFACE Interface;
XENVIF_VIF_ACQUIRE Acquire;
XENVIF_VIF_RELEASE Release;
XENVIF_VIF_MAC_QUERY_FILTER_LEVEL MacQueryFilterLevel;
};
-typedef struct _XENVIF_VIF_INTERFACE_V8 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTERFACE;
+typedef struct _XENVIF_VIF_INTERFACE_V9 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTERFACE;
/*! \def XENVIF_VIF
\brief Macro at assist in method invocation
#endif // _WINDLL
#define XENVIF_VIF_INTERFACE_VERSION_MIN 8
-#define XENVIF_VIF_INTERFACE_VERSION_MAX 8
+#define XENVIF_VIF_INTERFACE_VERSION_MAX 9
#endif // _XENVIF_INTERFACE_H
ULONG Version;
XENVIF_VIF_CALLBACK Callback;
PVOID Argument;
+ XENVIF_VIF_CALLBACK_V8 CallbackVersion8;
+ PVOID ArgumentVersion8;
PXENVIF_THREAD MacThread;
KEVENT MacEvent;
XENBUS_SUSPEND_INTERFACE SuspendInterface;
if (ThreadIsAlerted(Self))
break;
-
+
if (Context->Enabled)
- Context->Callback(Context->Argument,
- XENVIF_MAC_STATE_CHANGE);
+ Context->Callback(Context->Argument, XENVIF_MAC_STATE_CHANGE, NULL);
KeSetEvent(&Context->MacEvent, IO_NO_INCREMENT, FALSE);
}
return status;
}
+static VOID
+VifCallbackVersion8(
+ IN PVOID _Argument OPTIONAL,
+ IN XENVIF_VIF_CALLBACK_TYPE Type,
+ IN PXENVIF_VIF_CALLBACK_PARAMETERS Parameters
+ )
+{
+ PXENVIF_VIF_CONTEXT Context = _Argument;
+ XENVIF_VIF_CALLBACK_V8 Callback = Context->CallbackVersion8;
+ PVOID Argument = Context->ArgumentVersion8;
+
+ switch (Type) {
+ case XENVIF_TRANSMITTER_RETURN_PACKET: {
+ PVOID Cookie = Parameters->TransmitterReturnPacket.Cookie;
+ PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO Completion = Parameters->TransmitterReturnPacket.Completion;
+
+ Callback(Argument,
+ XENVIF_TRANSMITTER_RETURN_PACKET,
+ Cookie,
+ Completion);
+ break;
+ }
+ case XENVIF_RECEIVER_QUEUE_PACKET: {
+ ULONG Index = Parameters->ReceiverQueuePacket.Index;
+ PMDL Mdl = Parameters->ReceiverQueuePacket.Mdl;
+ ULONG Offset = Parameters->ReceiverQueuePacket.Offset;
+ ULONG Length= Parameters->ReceiverQueuePacket.Length;
+ XENVIF_PACKET_CHECKSUM_FLAGS Flags = Parameters->ReceiverQueuePacket.Flags;
+ USHORT MaximumSegmentSize = Parameters->ReceiverQueuePacket.MaximumSegmentSize;
+ USHORT TagControlInformation = Parameters->ReceiverQueuePacket.TagControlInformation;
+ PXENVIF_PACKET_INFO Info = Parameters->ReceiverQueuePacket.Info;
+ PXENVIF_PACKET_HASH Hash = Parameters->ReceiverQueuePacket.Hash;
+ BOOLEAN More = Parameters->ReceiverQueuePacket.More;
+ PVOID Cookie = Parameters->ReceiverQueuePacket.Cookie;
+
+ Callback(Argument,
+ XENVIF_RECEIVER_QUEUE_PACKET,
+ Index,
+ Mdl,
+ Offset,
+ Length,
+ Flags,
+ MaximumSegmentSize,
+ TagControlInformation,
+ Info,
+ Hash,
+ More,
+ Cookie);
+ break;
+ }
+ case XENVIF_MAC_STATE_CHANGE:
+ Callback(Argument, XENVIF_MAC_STATE_CHANGE);
+ break;
+
+ default:
+ ASSERT(FALSE);
+ break;
+ }
+}
+
+static NTSTATUS
+VifEnableVersion8(
+ IN PINTERFACE Interface,
+ IN XENVIF_VIF_CALLBACK_V8 Callback,
+ IN PVOID Argument
+ )
+{
+ PXENVIF_VIF_CONTEXT Context = Interface->Context;
+ KIRQL Irql;
+ NTSTATUS status;
+
+ Trace("====>\n");
+
+ AcquireMrswLockExclusive(&Context->Lock, &Irql);
+
+ Context->CallbackVersion8 = Callback;
+ Context->ArgumentVersion8 = Argument;
+
+ ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
+
+ status = VifEnable(Interface, VifCallbackVersion8, Context);
+
+ Trace("<====\n");
+
+ return status;
+}
+
static VOID
VifDisable(
IN PINTERFACE Interface
Context->Argument = NULL;
Context->Callback = NULL;
+ Context->ArgumentVersion8 = NULL;
+ Context->CallbackVersion8 = NULL;
+
ReleaseMrswLockShared(&Context->Lock);
done:
{ sizeof (struct _XENVIF_VIF_INTERFACE_V8), 8, NULL, NULL, NULL },
VifAcquire,
VifRelease,
+ VifEnableVersion8,
+ 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_V9 VifInterfaceVersion9 = {
+ { sizeof (struct _XENVIF_VIF_INTERFACE_V9), 9, NULL, NULL, NULL },
+ VifAcquire,
+ VifRelease,
VifEnable,
VifDisable,
VifQueryStatistic,
status = STATUS_SUCCESS;
break;
}
+ case 9: {
+ struct _XENVIF_VIF_INTERFACE_V9 *VifInterface;
+
+ VifInterface = (struct _XENVIF_VIF_INTERFACE_V9 *)Interface;
+
+ status = STATUS_BUFFER_OVERFLOW;
+ if (Size < sizeof (struct _XENVIF_VIF_INTERFACE_V9))
+ break;
+
+ *VifInterface = VifInterfaceVersion9;
+
+ ASSERT3U(Interface->Version, ==, Version);
+ Interface->Context = Context;
+
+ status = STATUS_SUCCESS;
+ break;
+ }
default:
status = STATUS_NOT_SUPPORTED;
break;
Trace("<====\n");
}
-static FORCEINLINE VOID
-__VifReceiverQueuePacket(
- 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
- )
-{
- Context->Callback(Context->Argument,
- XENVIF_RECEIVER_QUEUE_PACKET,
- Index,
- Mdl,
- Offset,
- Length,
- Flags,
- MaximumSegmentSize,
- TagControlInformation,
- Info,
- Hash,
- More,
- Cookie);
-
-}
-
VOID
VifReceiverQueuePacket(
IN PXENVIF_VIF_CONTEXT Context,
)
{
KIRQL Irql;
+ XENVIF_VIF_CALLBACK_PARAMETERS Parameters;
+
+ RtlZeroMemory(&Parameters, sizeof (XENVIF_VIF_CALLBACK_PARAMETERS));
KeRaiseIrql(DISPATCH_LEVEL, &Irql);
- switch (Context->Version) {
- case 8:
- __VifReceiverQueuePacket(Context,
- Index,
- Mdl,
- Offset,
- Length,
- Flags,
- MaximumSegmentSize,
- TagControlInformation,
- Info,
- Hash,
- More,
- Cookie);
- break;
+ Parameters.ReceiverQueuePacket.Index = Index;
+ Parameters.ReceiverQueuePacket.Mdl = Mdl;
+ Parameters.ReceiverQueuePacket.Offset = Offset;
+ Parameters.ReceiverQueuePacket.Length = Length;
+ Parameters.ReceiverQueuePacket.Flags = Flags;
+ Parameters.ReceiverQueuePacket.MaximumSegmentSize = MaximumSegmentSize;
+ Parameters.ReceiverQueuePacket.TagControlInformation = TagControlInformation;
+ Parameters.ReceiverQueuePacket.Info = Info;
+ Parameters.ReceiverQueuePacket.Hash = Hash;
+ Parameters.ReceiverQueuePacket.More = More;
+ Parameters.ReceiverQueuePacket.Cookie = Cookie;
- default:
- ASSERT(FALSE);
- break;
- }
+ Context->Callback(Context->Argument, XENVIF_RECEIVER_QUEUE_PACKET, &Parameters);
KeLowerIrql(Irql);
}
IN PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO Completion
)
{
- switch (Context->Version) {
- case 8:
- Context->Callback(Context->Argument,
- XENVIF_TRANSMITTER_RETURN_PACKET,
- Cookie,
- Completion);
- break;
+ XENVIF_VIF_CALLBACK_PARAMETERS Parameters;
- default:
- ASSERT(FALSE);
- break;
- }
+ RtlZeroMemory(&Parameters, sizeof (XENVIF_VIF_CALLBACK_PARAMETERS));
+
+ Parameters.TransmitterReturnPacket.Cookie = Cookie;
+ Parameters.TransmitterReturnPacket.Completion = Completion;
+
+ Context->Callback(Context->Argument, XENVIF_TRANSMITTER_RETURN_PACKET, &Parameters);
}
PXENVIF_THREAD